需要Java缓存解决方案

时间:2012-11-15 11:44:54

标签: java hibernate caching ehcache

我正在寻找Java Web应用程序的缓存解决方案。我们有一个Oracle数据库实例和2-3个远程数据库实例。 我们希望将数据本地缓存到我们的应用程序,因为我们无法接受数据库响应时间。 我们的数据集具有平均大小(每个表几千行)并且从我们的应用程序手动修改(因此不经常)(没有直接的数据库访问)。

所以我们一直在考虑的是一种解决方案,它允许我们拥有本地所需的所有数据。我们希望减少从db检索并重写到缓存的数据量。

因此,例如,当一个实体被修改时,我们不希望使该表上的所有缓存查询无效,我们宁愿希望能够修改本地缓存的查询结果集,因此查询仍然可以从缓存中本地运行数据。 缓存必须复制其更改\检索由db的其他应用程序实例修改的数据。

我们一直在将EhCache视为Hibernate二级缓存,但它会在任何表修改时使给定表的所有缓存查询无效。我快速浏览了一下Hibernate Services,但不知道是否允许我们覆盖hibernate二级缓存默认行为以满足我们的需求。

我们可以使用其他任何解决方案吗?

修改我们希望能够非常快速地访问数据。实际上我们正在寻找的是一个可变的缓存。

3 个答案:

答案 0 :(得分:3)

你检查过JBoss缓存了吗?您可以单独为查询定义逐出策略,也可以在群集节点之间轻松实现同步。如果你需要,你可以阅读我编写的文章,如果它对你有帮助,可以回顾一下我的经验;

http://dinukaroshan.blogspot.com/2009/10/jboss-caching-integration.html

答案 1 :(得分:2)

如果您使用EhCache并且群集中有多个应用程序,则必须使用机制(JMS,JGroups,...)进行数据缓存复制。

您必须注意的一件事是,如果您有另一个未在Java中运行的应用程序,则不会通知应用程序:JGroups仅在Java中可用,您的非Java应用程序将无法使缓存无效实体。 EhCache / Jgroups支持允许您在一个配置文件中设置复制(无需其他代码!)

您似乎正在寻找EhCache的“通过复制更新”功能。让我列出一个EhCache的配置可能性:

通过复制与失效进行更新

通过复制更新:发送到所有节点的数据
优点:避免完全重新加载缓存
缺点:节点之间的非相干数据是可能的&如果缓存数据的TTL低,则无用

通过无效更新:发送到所有节点的无效通知。如果数据已经缓存,则节点会再次删除数据库中的缓存数据查询 优点:数据一致性和网络流量较轻
缺点:许多数据库查询可能会同时导致大量数据需求


异步与同步

<强>异步
优点:快速回复&amp;和数据传输
缺点:UDP ...

同步
优点:数据完整性
缺点:Perf ......


我希望它能帮助你做出正确的决定。

答案 2 :(得分:0)

缓存查询结果的失效不是缓存控制的东西,而是Hibernate如何处理他的QueryCache ...如果不改变代码,我不知道你是怎么做的那。此外,我不认为有更好的“适合所有人”#34;坦率地解决这个问题。

因此,如果您希望非常专门缓存查询结果,我想您必须自己实现。

此外,如果您需要更高的一致性保证,您可能希望使用群集缓存,而不是复制的缓存...