首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA后台缓存刷新

JPA后台缓存刷新
EN

Stack Overflow用户
提问于 2011-04-15 16:30:53
回答 3查看 1.9K关注 0票数 8

我们有一个高性能的Java (J2SE)中间件应用程序,其中延迟是最重要的。它使用遗留数据库中保存的一些标准数据,其中遗留应用程序可能会偶尔修改数据。由于延迟要求,我们计划缓存标准数据,使用Hibernate的JPA,可能还有Ehcache这样的缓存提供程序。

但是,当标准数据更新(由遗留应用程序)时,需要尽快通知我们这一点。我在考虑在缓存上设置一个过期时间,但是直到应用程序发出下一次数据请求时,缓存才会被刷新-此时,由于数据库重新读取,延迟将会受到影响。

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

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

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

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

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-05-07 21:53:12

您使用的是什么数据库?

EclipseLink 2.4将提供数据库事件驱动的缓存失效功能。这与Oracle数据库DCN/QCN集成在一起。你也可以用触发器来连接一些东西。

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

您可能还希望研究一下Oracle网格、Coherence和TopLink GoldenGate。

票数 5
EN

Stack Overflow用户

发布于 2011-04-15 16:52:19

如果您可以更改遗留应用程序,那么一种选择是使用ActiveMQ之类的内容发送缓存无效通知。如果不能更改遗留应用程序,另一种选择是向表中添加一个带索引的时间戳/行版本列,并定期轮询自上次轮询以来的更改。

票数 1
EN

Stack Overflow用户

发布于 2012-05-11 21:06:05

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5674198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档