最近私のJavaアプリケーションをhibernate 4.1からhibernate 5.2にアップグレードし、2番目のレベルのエンティティキャッシュの使用に違いがあることに気付きました。キャッシュは、以前のバージョンと同じくらい頻繁に使用されることはありません。2番目のレベルのキャッシュエンティティのハイバーネーションでの使用5.2
物事を単純化するために、私は非常に基本的なモデルを持っているとしましょう:親との関係が1対1のCHILDエンティティ。 PARENTクラスには@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
という注釈が付けられています。 CHILDの多対一の関係には@Fetch(FetchMode.SELECT)
という注釈が付けられています。これにより、CHILDをフェッチするときに第2レベルのキャッシュがPARENTを格納する機会が与えられるはずです。
1つのCHILDインスタンス(from CHILD where id=:id
のようなクエリを使用)をロードすると、PARENTキャッシュが使用されていることがわかります。クエリを再度実行すると、PARENTセカンダリセレクトはデータベースに繰り返されません。
ただし、複数のCHILDを一度にロードすると(from CHILD
のようなクエリで)、PARENTキャッシュは使用されません。もう一度クエリを実行すると、セカンダリのPARENTセレクトが繰り返されます。
これはパフォーマンスの大きな損失です。誰も同じ問題に遭遇しましたか?いくつかの構成部分が欠けていますか?
ありがとうございました。
キャッシュの無効化を防ぐにはhttps://stackoverflow.com/questions/19054673/2nd-level-cache-invalidation-with-native-queriesを参照してください。 – JDM