6

アプリケーションで Hibernate のセカンド レベル キャッシュを使用しています。特定のビジネス上の理由から、エンティティ アノテーションを変更できなくなりました

私のプロジェクトでは、データベースを Hibernate から変更する以外に、Hibernate を経由しないネイティブ SQL が他にも存在します。したがって、データベースがネイティブ SQL から更新された後、Hibernate の第 2 レベルのキャッシュ データが古くなる可能性があります。そのため、特定のエンティティの 2 次キャッシュを無効にする必要があります (プログラムによって、または注釈を変更する以外の方法で)。

前もって感謝します!

4

2 に答える 2

7

警告: Jens Schauder が指摘したように、maxElementsInMemory="0" を設定して Ehcache をメモリに 0 要素を格納するように設定することは不可能です。これは事実上反対の効果を引き起こし、キャッシュのサイズを無制限に設定するためです。この動作はHibernate Cachingページには記載されていませんが、 Cache Configurationページに記載されています。

ドキュメントをすばやく確認しましたが、別のアプローチはまだ見つかりません。この回答を自分で削除することはできません。:-(

私の最初の提案:

セカンド レベル キャッシュの実装プロバイダーを設定して、TTL 時間を短くしたり、特定のエンティティ タイプのエントリを 0 に保存したりできます。

たとえば、Ehcache を使用している場合は、ehcache.xml で構成できます:*

<cache
name="com.problematic.cache.EntityName"
maxElementsInMemory="0" <<== this should effectively disable caching for EntityName
overflowToDisk="false" <<== Do not overflow any entries to disk
/>

Ehcache ドキュメントのHibernate Cachingを参照してください。

于 2009-06-01T11:07:37.040 に答える
1

Terracotta 3.1 以降では、Terracotta 開発者コンソールを使用して、構成 (静的) と実行時の両方で、Hibernate 2nd Level Caches をリージョンごとに有効/無効にすることができます。

クラスター内またはクラスター全体の個々のノードについて、キャッシュと Hibernate に関するリアルタイムの統計を監視することもできます。

Terracotta はオープンソースです。詳細については、Terracotta for Hibernate を参照してください。

于 2009-06-11T07:12:24.800 に答える