我打算在我的应用程序组件中使用SelfPopulatingCache,因为它支持read-through以及看起来像刷新的后备缓存。
但是,我对 timeToLiveSeconds 配置感到有些困惑。这是我的测试配置:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<cache name="myCache" maxElementsInMemory="50000" overflowToDisk="false"
eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="2"/>
</ehcache>
在我的单元测试中,我执行以下操作:
在线发布其他帖子(而不是文档),当我下次执行阅读时,我的条目应该被逐出。
但是,将调用CacheEntryFactory,并将空元素添加到我的过期元素的缓存中。
当timeToLiveSeconds到期时,有没有办法将其配置为执行完全驱逐?
答案 0 :(得分:3)
我认为“完全驱逐”只有在有单独的到期线程时才会发生。不幸的是,对于内存条目,没有这样的东西。引用Ehcache FAQ:
因为MemoryStore具有固定的最大元素数,所以 最大内存使用量等于元素数量 乘以平均大小。当一个元素被添加到 最大大小,LRU元素被推入DiskStore。虽然我们 可能有一个到期线程定期到期元素,它是远的 更高效,只检查我们需要的时间。权衡更高 平均内存使用量。到期线程使DiskStore保持干净。那里 希望更少争夺DiskStore的锁,因为 常用的值在MemoryStore中。我们安装DiskStore Linux使用RAMFS,因此它使用的是操作系统内存。虽然我们有更多的这一点 比2GB 32位进程大小限制,它仍然是一个昂贵的 资源。 DiskStore线程使其受到控制。如果你是 关注CPU利用率和DiskStore中的锁定,你可以 将diskExpiryThreadIntervalSeconds设置为一个较大的数字,例如1 天。或者,你可以通过设置来有效地关闭它 diskExpiryThreadIntervalSeconds到一个非常大的值。