JPA后台缓存刷新

时间:2011-04-15 08:30:53

标签: java spring caching jpa ehcache

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

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

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

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

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

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

提前致谢。

3 个答案:

答案 0 :(得分:5)

您使用的数据库是什么?

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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