我正在使用Hazelcast作为Hibernate的二级缓存提供程序。我看到的是,无论hazelcast.xml中的设置如何,缓存条目每60秒就会被清除一次。
我的hazelcast.xml配置:
<map name="default">
<in-memory-format>BINARY</in-memory-format>
<backup-count>1</backup-count>
<async-backup-count>0</async-backup-count>
<time-to-live-seconds>21600</time-to-live-seconds>
<max-idle-seconds>1800</max-idle-seconds>
<eviction-policy>NONE</eviction-policy>
<max-size policy="PER_NODE">10000</max-size>
<eviction-percentage>25</eviction-percentage>
<min-eviction-check-millis>100</min-eviction-check-millis>
<merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
<cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
<statistics-enabled>true</statistics-enabled>
</map>
<map name="*.Member">
<in-memory-format>BINARY</in-memory-format>
<backup-count>0</backup-count>
<async-backup-count>0</async-backup-count>
<time-to-live-seconds>21600</time-to-live-seconds>
<max-idle-seconds>1800</max-idle-seconds>
<eviction-policy>LFU</eviction-policy>
<max-size policy="PER_NODE">4000</max-size>
<statistics-enabled>true</statistics-enabled>
</map>
我的hibernate.cache.region.factory_class
设置为HazelcastLocalCacheRegionFactory
。
通过打开所有我可以找到的日志记录,我可以看到第一个发布SQL的事务加载了Member
对象。后续事务不发出SQL;而是按预期在第二级缓存中找到对象。但是,在60秒后,将报告缓存丢失(即使空闲时间为1800秒)。通过每5秒发送一次相同的请求并查看日志,我可以看到这一点-60秒后,我看到发出了重新加载项目的新SQL。 Hibernate或Hazelcast从来没有任何迹象表明这些对象正在被驱逐。
我还尝试从地图名称中删除通配符,并使用FQCN。
记录器是
<logger name="org.hibernate.sql" level="DEBUG" />
<logger name="org.hibernate.jdbc" level="DEBUG" />
<logger name="org.hibernate.cache" level="DEBUG" />
<logger name="org.hibernate.event" level="TRACE" />
<logger name="com.hazelcast" level="TRACE" />
我正在使用
答案 0 :(得分:0)
我遇到了同样的问题。每60秒CleanupService
在cleanup
中运行LocalRegionCache
,将ttl> 0的条目从缓存中删除。
可能是hazelcast-hibernate53中的错误。我将其报告为issue。
编辑: 这是一个错误。它已在hazelcast-hibernate5 1.3.2中修复。