ECache 刷新时在磁盘上维护持久性副本



我正在使用Spring框架和Java CXF服务。

我的项目要求每 15 分钟从数据库刷新一次缓存。从数据库中提取数据平均需要一分钟。因此,虽然这一分钟操作(缓存正在从数据库刷新),但如果我尝试访问缓存,它应该返回以前存储的值。

时间线去 ->

0 分钟:应用程序启动。缓存刷新的触发器。

0.5 分钟:正在通过查询数据库加载缓存

1 分钟:缓存加载(例如:xyz)

5 分钟:访问缓存并返回 xyz

15 分钟

:缓存应刷新(新的缓存值将在 16 分钟时为 xyw)

15.5 分钟:正在通过查询数据库加载缓存。此时,如果访问缓存,它应返回以前的缓存值,因为新缓存现在处于不一致状态。(应返回 xyz)

16 分钟:缓存重新加载。如果现在访问,则应返回 xyq。

我有两个问题:

  1. 现在我有一个 Spring 任务调度程序,每 15 分钟进行一次缓存刷新。我可以用ehcache本身吗?
    我的 ehcache.xml 看起来像:
<ehcache>
    <cache name="mycache" 
        maxElementsInMemory="3000"
        eternal="false" 
        timeToIdleSeconds="60000"  
        timeToLiveSeconds="60000"  
        overflowToDisk="true"  
        diskPersistent="false" />
        <persistence strategy="localTempSwap" synchronousWrites="true" />
    </cache>  
</ehcache>
  1. 如何实现此缓存的行为方式,如描述的 15.5 分钟?

答案:

  1. Ehcache有一个使用Quartz调度程序的计划刷新装饰器。有关如何使用它,请参阅此文档。
  2. Ehcache 不会提供此行为,除非您使刷新过程成为事务性。否则,您将在获得密钥时点击映射到密钥的任何值。

最新更新