2016-09-20 61 views
1

當我們使用Hazelcast作爲緩存提供程序時,我們發現我們的Hibernate查詢緩存存在一個奇怪的問題。這是我們的設置:Hibernate + Hazelcast查詢緩存有時不會刷新

  • Hazelcast 3.6.5與hazelcast-hibernate4
  • 休眠集羣

配置在persistence.xml中的4.3.10

  • 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查詢是針對數據庫發送(如在日誌中觀察到的)。清除一個節點上的查詢緩存導致所有NODES請求來自數據庫的新數據。

    我們首先觀察了一個由數據庫視圖支持的實體列表,但該視圖使用@Synchronized進行了正確註釋,並且在調試過程中我們看到Hibernate正確檢查了所提到的表的區域。如果查詢緩存停止工作,緩存超時(在hazelcast.xml中配置)會導致最終顯示正確的結果。

    挖掘日誌中我們看到,一旦查詢緩存停止工作,時間戳緩存報告@Synchronized中提到的區域的緩存數據比查詢緩存結果更早,因此Hibernate不會丟棄舊條目和請求新數據。

    我在persistence.xml中多次檢查了配置,看到我們沒有激活這個屬性:hibernate.cache.use_minimal_puts - 是否會有所作爲(我當然可以簡單地應用它,但我想知道爲什麼這會解決我們的問題)。

    我們在這裏感到茫然,因爲我們不知道如何正確地重現問題,我們不知道是什麼原因造成的。此外,來自Hazelcast的hibernate-cache集成並不是很冗長,所以很難看到發生了什麼......

    在此先感謝!

  • 回答

    0

    Hibernate只提供第二級緩存SPI。 Ehcache模塊由Ehcache團隊維護,與Infinispan和Hazelcast一樣,所以來自Hazelcast團隊的人可能知道是什麼原因導致了這個問題。

    既然你問了hibernate.cache.use_minimal_puts,我會回答你的問題的這一部分。此配置屬性優化了二級緩存操作以最大限度地減少寫入,而您爲更頻繁的讀取支付價格。

    此設置對羣集緩存非常有用,因此Hazelcast可能會從中受益。通常,第二級緩存提供程序會自動爲集羣環境啓用它。