【问题标题】:Java caching solution needed需要 Java 缓存解决方案
【发布时间】:2012-11-23 02:17:24
【问题描述】:

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

因此,我们一直在考虑一种解决方案,该解决方案使我们能够拥有本地所需的所有数据。我们希望减少从 db 检索并重写到缓存的数据量。

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

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

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

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

【问题讨论】:

  • 为什么不创建一个本地数据库并将其复制到远程?除了连接字符串之外,它将避免任何代码更改,提供更快的速度并确保与远程数据库的数据一致性。
  • 您是否建议每个应用程序实例使用一个数据库实例?对我来说似乎有很多设置开销。
  • 否 - 在本地服务器/虚拟机上运行数据库的完整副本,然后以主/从关系将其复制到远程。
  • 您仍然没有在应用层缓存任何数据,这种方法需要始终从数据库中读取任何正在处理的请求。我认为这样做是为了避免每次都受到打击数据库的惩罚。
  • 我们希望能够非常快速地访问数据。实际上,我们正在寻找的是一个 quaryable 缓存。

标签: java hibernate caching ehcache


【解决方案1】:

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

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

【讨论】:

  • 是否可以使用 JBoss 更改默认的休眠二级缓存行为,即每次进行任何修改时都会使表上的所有缓存查询无效?标准休眠二级缓存不能满足我们的需求,因为查询缓存只对静态数据有意义。
  • 嗨 Bart,通常经验法则是缓存很少更改但经常读取的数据(例如主数据).. 我不确定您是否可以更改失效规则.. 但会检查并回复你..
【解决方案2】:

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

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

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

通过复制与无效更新

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

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


异步与同步

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

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


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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 2011-03-01
      • 2014-03-21
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多