Hibernateキャッシュパフォーマンスチューニング

あんまりまとまってないけど、とりあえずメモっておく。
確実に裏の取れていないところは、後で修正予定。

基本的禁則事項

クエリキャッシュ対象のエンティティの2次キャッシュが設定されていない場合。

この設定は、Hibernate のマニュアルでも禁止事項として上げられています。たとえば、あるクエリに対して100件のエンティティが返される場合を考えてみます。

  • キャッシュミスした場合
    • クエリが発行され、DBから100件分のレコードが返され、クエリキャッシュ上にはエンティティのidが100件分格納される。
  • キャッシュヒットした場合
    • クエリキャッシュがヒットし、100エンティティ分のidからエンティティを取得しようとする。
    • 2次キャッシュが有効ではないため、各エンティティを取得するために100回クエリを発行する。

このように、普通に SQL でアクセスするよりもはるかに多くのクエリを発行するという恐ろしい状況が待っています。

クエリキャッシュが無効なクエリにより取得されるエンティティが2次キャッシュ対象になっていて、かつそのクエリ経由以外でそのエンティティが利用されない場合。
  • クエリキャッシュが無効のクエリにより、毎回クエリが発行され、結果が2次キャッシュに登録されます。
  • 2次キャッシュが使用されることは、ありません。

ということで、全くのムダです。このような場合は、対象エンティティの2次キャッシュ設定を無効にする方法が有効です。