infinispan hibernate缓存逐出

时间:2015-08-14 13:59:34

标签: java hibernate caching infinispan

我使用Infinispan 6.0.0和Hibernate 4.3.6。

我的配置是:

    <!-- 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时,永远不会发生驱逐。

对于我的一些实体,缓存条目在添加到缓存后很快就会被删除。 add只是一个返回很多这些对象的查询(&lt; 1000)。这些对象不会被更改(因此不应发生失效)。

那么是什么导致infinispan从缓存中删除对象?

谢谢

3 个答案:

答案 0 :(得分:2)

我怀疑你遇到的问题是在Infinispan 7.2.x之前,驱逐是在段级别完成的,所以如果段大小达到它的极限(这是maxEntries的一小部分),那么它就是驱逐。问题在Infinispan 7.2.x中得到解决,如here所述。您应该尝试使用Infinispan 7.2.x,它应该适用于Hibernate 4.3。

答案 1 :(得分:1)

是的,除非explicitly provide that info,否则Hibernate不知道本机查询中的更新内容,因此它会清除整个二级缓存,以防止保留过时的数据。

告诉Hibernate本机查询不会影响二级缓存中的任何数据:

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

答案 2 :(得分:0)

行;得到它......

在Hibernate中,Query.executeUpdate()清除关联的实体缓存。

其他ORM也这样做?