2015-08-14 123 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一起工作。