Hibernate キャッシュ戦略
-
11-09-2019 - |
質問
どちらかをどうやって決めるのですか 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。戦略:トランザクション的な
トランザクションキャッシュ戦略は、JBoss Treecacheなどの完全なトランザクションキャッシュプロバイダーをサポートします。このようなキャッシュはJTA環境でのみ使用でき、指定する必要があります
hibernate.transaction.manager_lookup_class
.
言い換えると:
読み取り専用: 次のようなデータに役立ちます。 頻繁に読むが更新されない (例えば。国などの参照データ)。それは単純だ。すべての中で最高のパフォーマンスを持っています(明らかに)。
読み書き: データが必要な場合に望ましい 更新される. 。しかし、それは提供しません シリアル化可能 分離レベル、 ファントムリード が発生する可能性があります (トランザクションの終了時には、開始時には存在しなかったものが表示される場合があります)。読み取り専用よりもオーバーヘッドが大きくなります。
非厳密な読み取り/書き込み: あるいは、2 つの別個のトランザクション スレッドが同じオブジェクトを更新する可能性が低い場合は、非厳密読み取り書き込み戦略を使用することもできます。読み取り/書き込みよりもオーバーヘッドが少なくなります。これは、次のようなデータに役立ちます。 めったに更新されない.
トランザクション: 必要な場合は、 完全にトランザクション対応 キャッシュ。JTA 環境でのみ適しています。
したがって、適切な戦略の選択は、データが更新されるかどうか、更新の頻度、および必要な分離レベルによって異なります。キャッシュに入れたいデータに関してこれらの質問に答える方法がわからない場合は、DBA にサポートを求めてください。
他のヒント
読み取り専用: 決して変更されないエンティティにのみ使用されます (そのようなエンティティを更新しようとすると例外がスローされます)。とてもシンプルで高性能です。変化しない静的な参照データに非常に適しています。
NONSTRICT_READ_WRITE: キャッシュは、影響を受けるデータを変更するトランザクションがコミットされた後に更新されます。したがって、強力な一貫性は保証されず、短い時間枠で古いデータがキャッシュから取得される可能性があります。この種の戦略は、結果整合性を許容できるユースケースに適しています。
読み書き: この戦略は、「ソフト」ロックを使用することで強力な一貫性を保証します。キャッシュされたエンティティが更新されると、そのエンティティのソフト ロックもキャッシュに保存され、トランザクションがコミットされた後に解放されます。ソフトロックされたエントリにアクセスするすべての同時トランザクションは、対応するデータをデータベースから直接フェッチします。
トランザクション: キャッシュの変更は分散 XA トランザクションで行われます。キャッシュされたエンティティの変更は、同じ XA トランザクション内のデータベースとキャッシュの両方でコミットまたはロールバックされます。
レディングのAPIのドキュメントは良いことですが、あなたはまた、ドキュメント(その素晴らしい)も、<のhref = "http://docs.jboss.org/hibernate/core/3.3/reference/en/html/をお読みくださいperformance.html#パフォーマンスキャッシュ」のrel = "nofollowをnoreferrer">セカンドレベルキャッシュ - 。戦略に
トランザクション - まれに更新が発生する場合に、同時トランザクションでデータが古くならないようにすることが重要な場合、読み取りがほとんどのデータにこの戦略を使用します。
読み取り/書き込み - まれに更新が発生する場合に、同時トランザクションでデータが古くならないようにすることが重要な場合は、読み取りがほとんどのデータに対してこの戦略を再度使用します。
Nonstrict-read-write -この戦略では、キャッシュとデータベース間の一貫性は保証されません。データがほとんど変更されず、データが古い可能性が低いことが重大な懸念事項ではない場合は、この戦略を使用してください。
読み取り専用 - データに適した同時実行戦略。変更されることはありません。参考データとしてのみご利用ください。
これであなたの疑問が解消されることを願っています。