infinispan 休眠缓存逐出
infinispan hibernate cache eviction
我正在使用 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 时,永远不会发生驱逐。
对于我的某些实体,缓存条目在添加到缓存后很快就会被删除。添加只是一个查询,其中 returns 很多这些对象 (< 1000)。这些对象随后不会更改(因此不会发生失效)。
那么是什么原因导致 infinispan 从缓存中删除对象?
谢谢
好的;知道了...
在 Hibernate 中 Query.executeUpdate() 清除关联的实体缓存。
其他 ORM 也这样做吗?
是的,除非您 explicitly provide that info,否则 Hibernate 不知道本机查询中更新了什么,因此它会清除整个二级缓存以防止保留过时数据。
告诉Hibernate本机查询不影响二级缓存中的任何数据:
SQLQuery sqlQuery = session.createSQLQuery(" ... ");
sqlQuery.addSynchronizedQuerySpace("");
sqlQuery.executeUpdate();
我怀疑您遇到的问题是 Infinispan 7 之前的问题。2.x,驱逐是在段级别完成的,因此如果段大小达到限制(这是 maxEntries 的一小部分),然后它会被驱逐。该问题已在 Infinispan 7 中解决。2.x 如 here 所述。您应该尝试使用 Infinispan 7。2.x,它应该适用于 Hibernate 4.3。
我正在使用 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 时,永远不会发生驱逐。
对于我的某些实体,缓存条目在添加到缓存后很快就会被删除。添加只是一个查询,其中 returns 很多这些对象 (< 1000)。这些对象随后不会更改(因此不会发生失效)。
那么是什么原因导致 infinispan 从缓存中删除对象?
谢谢
好的;知道了...
在 Hibernate 中 Query.executeUpdate() 清除关联的实体缓存。
其他 ORM 也这样做吗?
是的,除非您 explicitly provide that info,否则 Hibernate 不知道本机查询中更新了什么,因此它会清除整个二级缓存以防止保留过时数据。
告诉Hibernate本机查询不影响二级缓存中的任何数据:
SQLQuery sqlQuery = session.createSQLQuery(" ... ");
sqlQuery.addSynchronizedQuerySpace("");
sqlQuery.executeUpdate();
我怀疑您遇到的问题是 Infinispan 7 之前的问题。2.x,驱逐是在段级别完成的,因此如果段大小达到限制(这是 maxEntries 的一小部分),然后它会被驱逐。该问题已在 Infinispan 7 中解决。2.x 如 here 所述。您应该尝试使用 Infinispan 7。2.x,它应该适用于 Hibernate 4.3。