首页 文章

JPA后台缓存刷新

提问于
浏览
8

我们有一个高性能Java(J2SE)中间件应用程序,其中延迟是最重要的 . 它使用遗留数据库中保存的一些常设数据,遗留应用程序可以在这些数据中偶尔修改数据 . 由于延迟要求,我们计划使用JPA和Hibernate以及可能是缓存提供程序(如Ehcache)来缓存常备数据 .

但是,当站点数据更新(由传统应用程序)时,我们需要尽快通知此情况 . 我想在缓存上设置一个到期时间,但是在应用程序发出下一个数据请求之前,缓存不会刷新 - 此时由于数据库重新读取,延迟将会生效 .

理想情况下,我们需要缓存来返回过时的值,并在后台使用数据库中的最新值定期更新/刷新缓存 .

这可能与Ehcache有关吗?我见过SelfPopulatingCache和CacheLoader,但这似乎我做了很多工作(我必须为每个实体编写代码) . 另外,有没有人有CacheLoader实现的例子?我希望查询缓存上有一个异步刷新选项 .

还有其他技术可以提供解决方案吗?我们不受JPA提供程序或缓存提供程序的约束 .

Spring @Cacheable可以提供解决方案吗?我见过spring ehcache cachable提到自填充缓存范围,但我不清楚这意味着什么 .

提前致谢 .

3 回答

  • 1

    你用的是什么数据库?

    EclipseLink 2.4将提供数据库事件驱动的缓存失效功能 . 它与Oracle数据库DCN / QCN集成在一起 . 您也可以使用触发器来解决问题 .

    http://wiki.eclipse.org/EclipseLink/Examples/JPA/DCN

    您可能还希望调查Oracle GoldenGate,Coherence和TopLink Grid .

  • 5

    如果您可以更改旧版应用程序,则可以选择使用ActiveMQ之类的内容发送缓存失效通知 . 如果您无法更改旧应用程序,则另一个选项是向表中添加索引时间戳/行转换列,并定期轮询它以查看自上次轮询以来的更改 .

  • 1

    我不知道如何使用EhCache或其他组件来做到这一点,但这个问题的一个常见方法是“有2个缓存” . 让我解释一下:你有一个缓存为你的应用程序提供数据(这个缓存在提供应用程序时不会有任何更新)和另一个缓存由一个定时工作者创建的最新数据(你可以每隔x秒或每次创建一个缓存)您收到一个事件,告诉您数据已更改) . 当您的新缓存完成后,将旧缓存替换为新缓存,因此您最近更新的缓存现在为具有0缓存延迟的应用程序提供服务 . 如您所见,此方法的问题在于,当您的新缓存未完成时,您的客户端可能会看到陈旧数据 . 当然,这是一种非常昂贵的方法(你经常在内存中有2个缓存,并且经常会 Build 一个新的缓存) .

相关问题