キャッシュプロバイダとしてHazelcastを使用すると、Hibernateクエリキャッシュに異常な問題が発生します。これが私たちのセットアップです:hazelcast-hibernate4とHibernate + Hazelcastクエリキャッシュが時々リフレッシュされない
- Hazelcast 3.6.5
- 休止4.3.10 persistence.xmlでクラスタ
設定で
<properties>
<property name="javax.persistence.sharedCache.mode" value="DISABLE_SELECTIVE"/>
<property name="hibernate.cache.region_prefix" value="custom-pu"/>
<property name="hibernate.enable_lazy_load_no_trans" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.default_batch_fetch_size" value="50"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.event.merge.entity_copy_observer" value="log"/>
<property name="hibernate.session_factory_name" value="customSessionFactory"/>
<property name="hibernate.cache.hazelcast.configuration_file_path"
value="${config.dir}/custom-hazelcast.xml"/>
<property name="hibernate.cache.hazelcast.instance_name" value="customInstance"/>
<property name="hibernate.cache.hazelcast.use_native_client" value="false"/>
<property name="hibernate.cache.region.factory_class"
value="com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory"/>
<property name="hibernate.cache.hazelcast.shutdown_on_session_factory_close" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default"/>
<property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default"/>
</properties>
ユーザーが一部のデータとユーザーを更新したり、別のノードでユーザーが更新プログラムを表示しない - SQLクエリがないDBに対して送信されます(ログに記録されているように)。 1つのノードでクエリキャッシュをクリアすると、ALL NODESがDBから新鮮なデータを要求します。
データベースビューに基づいたエンティティのリストでこれを最初に観察しましたが、ビューに@Synchronizedというアノテーションが付けられていて、デバッグ中にHibernateが領域を正しくチェックしていることがわかりました。クエリキャッシュが機能しなくなった場合、キャッシュタイムアウト(hazelcast.xmlで設定されている)により、最終的に正しい結果が表示されます。
ログを掘り下げると、クエリキャッシュが機能しなくなると、タイムスタンプキャッシュは、@同期化に記載された領域のキャッシュデータがクエリキャッシュ結果よりも古いことを報告します。そのため、Hibernateは古いエントリを破棄せず、新しいデータ。
ここで、persistence.xmlの設定を何度も確認して、このプロパティを有効にしていないことがわかりました:hibernate.cache.use_minimal_puts - 違いがありますか(私はもちろん簡単に適用できますが、なぜそれが私たちの問題を解決するのか)。
問題を正しく再現する方法がわからず、原因がわからないため、ここでは紛失しています。さらに、Hazelcastからのハイバネートキャッシュの統合はあまり冗長ではないので、何が起こっているのか分かりにくいです...
ありがとうございます!