1

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

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

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

4

1 に答える 1

3

最先端のPOJO's in Action本がそれについて語っています

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

と...

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

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

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

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

よろしく、

于 2009-09-12T18:00:38.757 に答える