环境:Spring 4.2.6,Hibernate 4.x,Hazelcast 3.9
我们通过Spring Config xml中的hibernate属性启用了L2 Cache和Query Cache。此外,还启用了数据库查询日志和hibernate statistics / sql跟踪。 server.log清楚地表明启用了查询缓存和L2缓存(通过HZ日志语句)。驱逐也配置为大数(12小时)
配置:
<network>
.....
<tcp-ip enabled="true">
<interface>127.0.0.1</interface>
</tcp-ip>
</network>
<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>43200</time-to-live-seconds>
<max-idle-seconds>3600</max-idle-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="FREE_HEAP_PERCENTAGE">20</max-size>
<eviction-percentage>25</eviction-percentage>
<min-eviction-check-millis>300</min-eviction-check-millis>
<merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
</map>
当应用程序启动时,随着地图开始填满,HQL查询和JDBC时间在日志中可见。然后,当我们向应用程序发出请求时,将从缓存中提取部分数据,并从DB查询余额数据(通过hibernate和db日志可见)。如果请求在非常短的时间间隔内重复(大约<20秒),则不会再次触发数据库查询。但是,如果请求在较长时间(例如大约30秒)后重复,则会再次触发一些相同的查询。立即重复,不会触发相同的查询。
问题:有没有办法可以控制查询缓存数据在内存中的驱逐/时间?为什么某些查询的数据清除得如此之快?