4

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

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

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

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

还有其他我们可以使用的解决方案吗?

编辑我们希望能够非常快速地访问数据。实际上,我们正在寻找的是可存储的缓存。

4

3 回答 3

3

你检查过 JBoss 缓存吗?您可以为您的查询单独定义驱逐策略,并且它也很容易在集群节点之间同步。如果您需要,您可以阅读我根据我的经验编写的文章,如果它对您有帮助;

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

于 2012-11-15T12:15:55.930 回答
2

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

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

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

通过复制与失效更新

通过复制更新:数据发送到所有节点
优点:避免完全重新加载缓存
缺点:如果缓存数据的 TTL 低,节点之间的数据可能不一致且无用

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


异步与同步

异步
优点:快速回复和数据传输
缺点:UDP ...

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


我希望它可以帮助您做出正确的决定。

于 2012-11-15T12:31:14.493 回答
0

缓存查询结果的失效不是缓存可以控制的,而是 Hibernate 如何处理他的 QueryCache... 如果没有更改该代码,我不知道您将如何做到这一点。此外,坦率地说,我认为没有更好的“适合所有人”的解决方案。

因此,如果您想要非常专业的查询结果缓存,我想您必须自己实现。

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

于 2012-11-22T18:17:24.040 回答