1

环境:Spring 2.5.6、Hibernate 3.3.2、Ehcache 2.0.1、terracotta 3.2.1

我在一个抽象类上有一个缓存(有 5 个继承者)

<cache name="com.f4.owl.domain.good.GoodType"
       maxElementsInMemory="15000"
       eternal="false"
       timeToIdleSeconds="0"
       timeToLiveSeconds="0"
       overflowToDisk="false">
    <terracotta/>
</cache>

我还有一个加载 6550 个元素的页面。起初缓存似乎正在工作(从缓存中检索项目并且页面加载速度更快)但过了一段时间(从几分钟到几个小时),它会重新加载数据库中的所有内容。

使用 terracotta 开发人员控制台,看起来缓存确实从 6550 清空到大约 70 个元素。

据我了解,将 timeToIdleSeconds 和 timeToLiveSeconds 都设置为零应该使缓存永久化,因此它永远不会缩小。有人可以对此有所了解吗?

4

1 回答 1

1

终于搞定了。

它是由没有显式同步表的 sql 查询(在完全不相关的表上)引起的,因此导致整个缓存被清空。

这里的解释:http: //opensource.atlassian.com/projects/hibernate/browse/HHH-2224

解决方案是为任何映射文件中定义的所有非只读 sql 查询设置同步表。

<sql-query name="queryname">
<synchronize table="tablename"/>
...
</sql-query>
于 2010-08-18T16:45:05.147 回答