我使用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从缓存中删除对象?
谢谢
答案 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也这样做?