2015-08-14 144 views
0

我在Hibernate 4.3.6中使用Infinispan 6.0.0。infinispan休眠緩存驅逐

我的配置是:

<!-- Default configuration is appropriate for entity/collection caching. --> 
    <namedCache name="entity"> 
     <clustering mode="invalidation"> 
     <stateTransfer fetchInMemoryState="false" timeout="20000"/> 
     <sync replTimeout="20000"/> 
     </clustering> 
     <locking isolationLevel="READ_COMMITTED" concurrencyLevel="1000" 
       lockAcquisitionTimeout="15000" useLockStriping="false"/> 
     <!-- Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds. 
      0 means the eviction thread will never run. A separate executor is used for eviction in each cache. --> 
     <eviction maxEntries="${infinispan.maxEntries:10000}" strategy="LRU"/> 
     <expiration maxIdle="${infinispan.maxIdle:-1}" wakeUpInterval="5000"/> 
     <!-- <transaction transactionMode="TRANSACTIONAL" autoCommit="false" 
        lockingMode="OPTIMISTIC"/> --> 
    </namedCache> 

的系統屬性未設定的,所以默認值應用於(10.000,-1)。

據我所知,當maxEntries沒有達到時,驅逐不應該發生。

對於我的一些實體來說,緩存條目在添加到緩存後很快就會被刪除。添加只是一個查詢,它返回這些對象的很多(< 1000)。這些對象沒有改變(所以不應該發生失效)。

那麼,什麼導致infinispan從緩存中刪除對象?

謝謝

回答

1

是的,Hibernate不知道在本機查詢中更新了什麼,除非你explicitly provide that info,所以它清除整個二級緩存以防止保留過時的數據。

告訴Hibernate的本地查詢不影響在第二級緩存中的任何數據:

SQLQuery sqlQuery = session.createSQLQuery(" ... "); 
sqlQuery.addSynchronizedQuerySpace(""); 
sqlQuery.executeUpdate(); 
0

OK;得到它...

在Hibernate中Query.executeUpdate()清除關聯的實體緩存。

其他ORM的做法是一樣的嗎?

2

我懷疑你所遇到的問題是,前期的Infinispan 7.2.x,驅逐在做段的級別,所以如果段的大小達到了限制(這是maxEntries的一小部分),那麼它會踢出驅逐。 Infinispan 7.2.x解決了問題,解釋如here。你應該嘗試使用Infinispan 7.2.x,它應該與Hibernate 4.3一起工作。