在我的应用程序中,我使用带有以下ehcache设置的查询缓存:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<defaultCache
maxElementsInMemory="10000000"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="3600"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="1800" />
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxEntriesLocalHeap="10000000"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="3600">
<persistence strategy="localTempSwap"/>
</cache>
<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxEntriesLocalHeap="5000"
eternal="true">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
然后对于我的实体我有二级缓存,如:
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
我的查询如下:
getSession().createQuery("from DynamicScenario").setCacheable(true).list();
工作正常。但是,我在控制台中注意到的是,在对表进行一些更新之后,如更新/插入/删除,无论多少次我一次又一次地执行查询,hibernate仍会调用db来获取数据虽然当我监视ehcache时,这被记录为jConsole中的内存命中。这持续大约30秒,然后在31秒左右,当我再次执行查询时,我可以在控制台中看到,hibernate没有调用db,数据来自缓存。有什么理由吗?似乎hibernate应该释放一些资源来使缓存失效,然后在表更改时重建并持续一段时间......