2016-09-20 12 views
1

キャッシュプロバイダとしてHazelcastを使用すると、Hibernateクエリキャッシュに異常な問題が発生します。これが私たちのセットアップです:hazelcast-hibernate4とHibernate + Hazelcastクエリキャッシュが時々リフレッシュされない

  • Hazelcast 3.6.5
  • 休止4.3.10 persistence.xmlでクラスタ

設定で

  • 3のサーバー:

    <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からのハイバネートキャッシュの統合はあまり冗長ではないので、何が起こっているのか分かりにくいです...

    ありがとうございます!

  • 答えて

    0

    Hibernateは第2レベルのキャッシュSPIのみを提供します。 EhcacheモジュールはInfinispanとHazelcastと同じEhcacheチームによって管理されているため、Hazelcastチームの誰かがこの問題の原因を知っている可能性があります。

    hibernate.cache.use_minimal_putsについて尋ねられたので、私はあなたの質問のこの部分に答えます。この構成プロパティーは、第2レベルのキャッシュ操作を最適化して書き込みを最小限に抑えながら、より頻繁に読み取るための価格を支払うことができます。

    この設定は、クラスタ化されたキャッシュに役立ちます。そのため、Hazelcastにはメリットがあります。通常、第2レベルのキャッシング・プロバイダは、クラスタ環境で自動的に使用可能にします。

    関連する問題