使用するCacheConcurrencyStrategy
を決定するにはどうすればよいですか?
NonstrictReadWriteCache
、ReadOnlyCache
、ReadWriteCache
、TransactionalCache
。https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html を読みましたが、十分に詳細に説明していません。
Hibernateドキュメント はそれらを定義するのにかなり良い仕事をします:
19.2.2。戦略:読み取り専用
アプリケーションが永続クラスのインスタンスを読み取る必要があるが変更する必要がない場合は、読み取り専用キャッシュを使用できます。これは、最も単純で最適なパフォーマンス戦略です。クラスターでの使用にも安全です。
19.2.3。戦略:読み取り/書き込み
アプリケーションがデータを更新する必要がある場合は、読み取り/書き込みキャッシュが適切な場合があります。シリアル化可能なトランザクション分離レベルが必要な場合は、このキャッシュ戦略を使用しないでください。キャッシュがJTA環境で使用される場合は、プロパティ_
hibernate.transaction.manager_lookup_class
_を指定し、JTAを取得するための戦略に名前を付ける必要がありますTransactionManager
。他の環境では、Session.close()
またはSession.disconnect()
が呼び出されたときにトランザクションが完了していることを確認する必要があります。この戦略をクラスターで使用する場合は、基盤となるキャッシュ実装がロックをサポートしていることを確認する必要があります。組み込みのキャッシュプロバイダーはロックをサポートしていません。19.2.4。戦略:非厳密な読み取り/書き込み
アプリケーションがデータを更新する必要があるのはたまにしかなく(つまり、2つのトランザクションが同じアイテムを同時に更新しようとする可能性が非常に低い場合)、厳密なトランザクション分離が必要ない場合は、非厳密な読み取り/書き込みキャッシュが適切な場合があります。キャッシュがJTA環境で使用される場合は、_
hibernate.transaction.manager_lookup_class
_を指定する必要があります。他の環境では、Session.close()
またはSession.disconnect()
が呼び出されたときにトランザクションが完了していることを確認する必要があります。19.2.5。戦略:トランザクション
トランザクションキャッシュ戦略は、JBossTreeCacheなどの完全なトランザクションキャッシュプロバイダーのサポートを提供します。このようなキャッシュはJTA環境でのみ使用でき、_
hibernate.transaction.manager_lookup_class
_を指定する必要があります。
言い換えると:
読み取り専用:頻繁に読み取られるが、更新されないデータに役立ちます(例:国のような参照データ)。簡単です。それはすべての中で最高のパフォーマンスを持っています(明らかに)。
読み取り/書き込み:データを更新する必要がある場合が望ましい。ただし、 [〜#〜] serializable [〜#〜] 分離レベルは提供されません。 ファントム読み取り が発生する可能性があります(トランザクションの最後に何かが表示される場合があります)それは最初はありませんでした)。読み取り専用よりもオーバーヘッドが大きくなります。
非厳密な読み取り/書き込み:または、2つの別々のトランザクションスレッドが同じオブジェクトを更新する可能性が低い場合は、非厳密な読み取り/書き込み戦略を使用できます。読み取り/書き込みよりもオーバーヘッドが少なくなります。これは、めったに更新されないデータに役立ちます。
Transactional:完全にtransactionalキャッシュが必要な場合。 JTA環境でのみ適しています。
したがって、適切な戦略の選択は、データが更新されているかどうか、更新の頻度、および必要な分離レベルによって異なります。キャッシュに入れたいデータについてこれらの質問に答える方法がわからない場合は、DBAにサポートを依頼してください。
READ_ONLY:変更されないエンティティにのみ使用されます(そのようなエンティティを更新しようとすると例外がスローされます)。とてもシンプルでパフォーマンスが良いです。変更されない一部の静的参照データに非常に適しています。
NONSTRICT_READ_WRITE:影響を受けるデータを変更したトランザクションがコミットされた後、キャッシュが更新されます。したがって、強力な一貫性は保証されておらず、古いデータがキャッシュから取得される可能性のある小さな時間枠があります。この種の戦略は、結果整合性を許容できるユースケースに適しています。
READ_WRITE:この戦略は、「ソフト」ロックを使用して達成される強力な一貫性を保証します。キャッシュされたエンティティが更新されると、ソフトロックもそのエンティティのキャッシュに保存され、その後解放されます。トランザクションがコミットされます。ソフトロックされたエントリにアクセスするすべての同時トランザクションは、対応するデータをデータベースから直接フェッチします。
TRANSACTIONAL:キャッシュの変更は分散XAトランザクションで行われます。キャッシュされたエンティティの変更は、同じXAトランザクションのデータベースとキャッシュの両方でコミットまたはロールバックされます。
APIドキュメントを読むことは良いことですが、ドキュメント(その素晴らしい)も読む必要があります 第2レベルのキャッシュ-戦略 。
トランザクション-この戦略は、更新のまれなケースで、同時トランザクションで古いデータを防ぐことが重要なほとんどのデータを読み取るために使用します。
読み取り/書き込み-この戦略を読み取りに使用します。ほとんどの場合、更新のまれなケースで、同時トランザクションで古いデータを防ぐことが重要なデータです。
Nonstrict-read-write-この戦略は、キャッシュとデータベース間の一貫性を保証するものではありません。データがほとんど変更されず、古いデータの可能性がほとんどない場合は、この戦略を使用してください。
読み取り専用-データに適した同時実行戦略。変更されることはありません。参照データとしてのみ使用してください。
これがあなたの疑問を解消することを願っています!