【问题标题】:Cancelling timeToLive cache expiration in EhCache if my database is down?如果我的数据库已关闭,取消 EhCache 中的 timeToLive 缓存过期?
【发布时间】:2012-03-29 20:34:49
【问题描述】:

我有一个 Spring 3.0.x Web 项目,它显示一个用户链接页面,我遇到了一些难题。目前,我正在使用 EhCache 2.1.0 来缓存我的内容,这是所有静态内容,大约在蓝月亮中更改一次。内容本身存储在一个数据库中,可能会出现故障,但不会影响页面上显示的许多链接,我不关心这些链接的去向,我只关心显示它们。

我的困惑是:如何在 EhCache 的 timeToLive 中添加预检查,以便在缓存过期之前 ping 数据库?我想要它做的是 ping 数据库,如果它没有启动,则跳过清除缓存,并重置计时器以在 timeToLive 秒内再次检查。

在浏览了 ehcache.org 上的文档,并阅读了他们的缓存管理器和 cache event listenerscache pinningcache extensions 之后,我找不到任何可以帮助保证我做到这一点的方法。 . 我开始倾向于将 timeToLive 设置为 0 并实现我自己的 timeToLive 版本,但如果我可以使用 EhCache 中已经存在的东西会很好。

【问题讨论】:

    标签: java caching ehcache


    【解决方案1】:

    我最终创建了自己的缓存过期处理服务并启用了 ehcache。该服务的工作原理如下:

    • 我使用的一些数据库包含我的静态内容。我在枚举中声明了这些数据库。
    • 然后我创建了一个缓存过期元数据类,它包含:(1) 缓存键,(2) 生存时间,(3) 上次刷新时间,(4) 数据库依赖项(枚举值列表),(5) 弹簧bean id 包含 #6,(6) 用户定义的缓存过期方法名称。
    • 我将缓存的方法调用按数据库分开,并通过 xml 为每个方法创建了一个元数据 bean。
    • 在运行时,这些元数据 bean 中的每一个都被推送到服务的 cachekey 内部映射 -> 元数据 bean
    • 在服务中,我为每个数据库设置了 ping 方法,以确定它们是否已启动
    • 然后我通过将 timeToLive 设置为 0 来禁用 ehcache 的 timetolive

    该服务有自己的方法来检查缓存是否过期,称为 service.checkExpiration(cacheKey)。如果 cacheKey 的缓存过期了,我会 ping 元数据 bean 的每个依赖项,如果它们都启动了,我会动态调用用户定义的缓存过期方法名称。

    这就是缓存过期服务的核心。用户侧的实际实现至少有两条路线:

    • 您可以将每个带有@Ehcache 注释的方法调用包装在一个调用上述服务的方法中。然后,在您的调用代码中,调用包装器方法。如果你有很多方法,这可能会很糟糕
    • 或者,您可以使用 Spring AOP 和 @Before 注解挂钩方法调用,并进行缓存过期检查调用。

    我正在尝试后者,因为它不那么杂乱,虽然我不喜欢它更神奇。到目前为止,它看起来还不错。我真的希望 ehcache 支持某种预执行方法,它会为我节省很多时间来开发这个......虽然没有那么有趣:)

    【讨论】:

    • 这对我来说是成功的,并且简化了数据库停机定时炸弹。我正在努力使缓存更加健壮,以便它在命令/数据库恢复后自动填充。
    猜你喜欢
    • 2017-07-23
    • 2019-06-14
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2011-06-02
    相关资源
    最近更新 更多