データベースのデータをメモリにキャッシュしたい

一般的なデータベースは、基本的にはファイルI/Oを必要とするため、メモリ上で行われるアプリケーション処理に比べれば、比較的低速です。
また、データベースサーバは、通常アプリケーションが稼働するサーバとは別サーバになるため、大量のデータを取得する場合には、通信量がネックになり低速になります。
これらの要因で、データベースへのアクセスが、アプリケーションの性能ネックになる事がしばしばあります。

アプリケーションの稼働するサーバのメモリ上に、データベースのデータをキャッシュすれば、参照性能を飛躍的に向上できます。
但し、全てのケースにおけるデータベースへのアクセスを、メモリ上でキャッシュするとなると、それはオンメモリデータベースであり、一般的な製品を使うべきでしょう(だいたいは、非常に高価ですが)。

Nimbusでは、データベースを一部の用途において、メモリにキャッシュする仕組みを導入する事で、データベースとのハイブリッドで参照性能の高速化を実現する方法を提案します。

まず、データベース上のマスタテーブルです。
マスタテーブルは、アプリケーションの参照頻度が高い割には、データ量はたかがしれている場合が多いと言えます。
また、更新は、バッチ処理や運用系の機能での変更作業程度で、低頻度です。
また、問い合わせのSQLも単純なSELECT文でしょう。
このような性質のデータを、データベース上に毎回アクセスしに行くのは、非効率です。全て、メモリ上に展開しておき、更新があれば読み直せればよいのです。
それを実現できるのが、コードマスタです。

次に、データをKey-Valueで保持でき、参照頻度が高いデータベース上のデータです。
データベース上のこのような性質のデータをメモリ上にキャッシュできるのが、SharedContextサービスとContextStoreサービスの組み合わせです。
但し、SharedContextサービスは、全てのJVM上で同じデータを保持するので、1つのJVM上のメモリ中に保持しきれない場合は、適切ではありません。
その場合は、複数のJVMで分散してデータを保持するDistributedSharedContextを使えば解決できます。
更新は、データベースに対して行い、読み込みなおすか、メモリ中で更新しておき、あとでデータベースに書き込む事もできます。
但し、トランザクションをサポートしないので、その点は注意が必要です。


FAQ