JPA 后台缓存刷新

8
我们有一个高性能的Java(J2SE)中间件应用程序,延迟是最重要的。它使用一些保存在遗留数据库中的静态数据,其中遗留应用程序可能会偶尔修改数据。由于延迟要求,我们计划使用JPA和Hibernate以及Ehcache等缓存提供程序来缓存静态数据。
但是,当静态数据被更新(由遗留应用程序)时,我们需要尽快得到通知。我考虑在缓存上设置过期时间,但这样缓存将不会被刷新,直到应用程序下一次请求数据时 - 在这个时候,由于重新读取数据库,延迟将受到影响。
理想情况下,我们需要缓存返回旧值,并在后台以定期间隔更新/刷新来自数据库的最新值。
Ehcache是否支持这种方式?我看到了SelfPopulatingCache和CacheLoader,但这似乎需要编写大量代码(我需要为每个实体手动编写代码)。此外,有没有人有CacheLoader实现的示例?我希望在查询缓存上获得异步刷新选项。

是否有其他技术能够提供解决方案?我们不受JPA提供程序或缓存提供程序的限制。

Spring @Cacheable能提供解决方案吗?我看到spring ehcache cachable提到了自动填充缓存作用域,但我不清楚这是什么意思。

提前感谢。


传统应用程序有哪些集成选项可用? - Santosh
3个回答

4
你使用的是什么数据库?
EclipseLink 2.4将提供一个基于数据库事件驱动的缓存失效功能。这个功能与Oracle数据库的DCN/QCN集成。你也可以尝试使用触发器实现相应功能。

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

你可能还想研究Oracle GoldenGate、Coherence和TopLink Grid。

1

如果您可以更改传统应用程序,则一种选择是使用类似于ActiveMQ的缓存失效通知发送。如果您无法更改传统应用程序,则另一种选择是向表中添加索引时间戳/行版本列,并定期轮询它以查找自上次轮询以来的更改。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接