質問

他のアプリケーションがDBを変更していないことがわかっている場合、Hibernateの2次キャッシュ(EHCacheを使用している)が、DBにコミットされたエンティティをアプリケーションでキャッシュできるかどうか疑問に思っています。

レコードAを更新すると、レコードAの値がわかり、それをキャッシュできるはずです。TerracottaのようなJVMクラスタリングシステムは、Java同期ロックを使用してJVMヒープメモリに関してこのタイプの動作をサポートします。

HibernateでのEHCacheロックモードの構成

役に立ちましたか?

解決

最新のPOJOのアクションブックでそれについて語っています

  

単一サーバーアプリケーションが永続フレームワークを使用してデータベースを更新する場合、フレームワークはプロセスレベルキャッシュを更新します。

そして...

  

更新可能なキャッシュオブジェクトは、通常、オプティミスティックロックを使用する必要があります。これにより、アプリケーションがデータベースの変更を盲目的に上書きするのを防ぐことができます。また、トランザクションがデータベースですでに変更されたキャッシュオブジェクトを更新する場合、楽観的ロックの失敗によりトランザクションがロールバックされます。永続フレームワークはキャッシュから古いデータを削除し、アプリケーションは最新バージョンのデータでトランザクションを再試行できます。

また、JPA with Hibernate bookに従って、次の戦略のいずれかを選択します

  • トランザクション:管理された環境でのみ利用可能です。 必要に応じて、反復可能な読み取りまでのトランザクション分離。この戦略を使用して 同時トランザクションで古いデータを防ぐことが重要であるほとんどのデータを読み取り、 まれに更新されます。
  • 読み取り/書き込み:この戦略は、タイムスタンプを使用して読み取りコミット分離を維持します メカニズムであり、非クラスター環境でのみ使用可能です。繰り返しになりますが、更新のまれなケースで、同時トランザクションの古いデータを防ぐことが重要な場合、この戦略を読み取り専用データに使用します。

元のanwserに追加:Hibernateは、@ Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)を使用するかどうかにかかわらず、キャッシュとデータベース間の一貫性を保証しません。使用する場合は、パフォーマンスに影響する可能性がある十分に短い有効期限タイムアウトを設定する必要があります。

よろしく、

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top