Hibernate查询缓存驱逐

时间:2017-11-07 13:38:06

标签: hibernate hazelcast

环境: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秒)后重复,则会再次触发一些相同的查询。立即重复,不会触发相同的查询。

问题:有没有办法可以控制查询缓存数据在内存中的驱逐/时间?为什么某些查询的数据清除得如此之快?

0 个答案:

没有答案