java - 如果我的数据库关闭,取消 EhCache 中的 timeToLive 缓存过期?

标签 java caching ehcache

我有一个 Spring 3.0.x Web 项目,它向用户显示一个链接页面,但我遇到了一些困惑。目前,我正在使用 EhCache 2.1.0 来缓存我的内容,这些内容都是几乎千载难逢的静态内容。内容本身存储在可以关闭的数据库中,但不会影响页面上显示的许多链接,而且我不关心这些链接去哪里,我只关心显示它们。

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

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

最佳答案

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

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

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

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

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

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

关于java - 如果我的数据库关闭,取消 EhCache 中的 timeToLive 缓存过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8851274/

相关文章:

java - RecyclerView 适配器与卡片 View 仅显示散列图中的最后一项

java - 如何查询NamedJdbcTemplate中的单个列?

java - 网络中最后一个值缓存的目的是什么?

缓存模拟器

caching - CacheManager.Net - Redis 流水线

spring-boot - 无法让EHCache和Spring Boot启动

java - 小程序中两种 URL 格式之间的差异

java - 按对象的两个字段排序。 java

ehcache - ALL_CACHE_MANAGERS CacheManager net.sf.ehcache

java - Ehcache 二级缓存不适用于 JPA 和 Hibernate?