首页 > 解决方案 > 从批处理端更新数据库时,在 webapp 端刷新 Hibernate 缓存级别 2

问题描述

我有一个 webapp 应用程序和几个批量编辑同一个数据库。

WebApp 使用 Tomcat 数据源构建部署在 Tomcat 中。此数据源使用休眠二级缓存配置她自己的 ehcache.xml 文件。

批次正在运行以更新相同的数据库并使用它们自己的 ehcache 配置 ehcache.xml。

所以 webapp 和 batch 不共享同一个缓存区域。

我的问题是当批量更新数据库时,我的 webapp 视图没有更新。这种行为是正常的,因为缓存中的实体过期不是在 webapp 端完成的。刷新后视图正在更新。

我的问题:这种并发情况的最佳实践是什么?

谢谢

标签: javaperformancehibernatejpacaching

解决方案


没有最佳实践解决方案。您有几个变体,具体取决于您可以容忍缓存变冷的时间以及您对无效缓存条目的弹性。另一个标准是您要更新什么样的数据。是交易数据(金钱?)还是您每天更新一次且正确性并不重要的数据。我认为您的 Batch 应用程序与您的 Web 应用程序一起部署。这个假设很重要,因为您需要能够从批处理连接到您的休眠二级缓存才能发送失效。

  1. 执行批处理并为更新的条目发送异步失效消息。将有一个非常短的窗口,其中您的缓存将包含陈旧的条目,但只要您对资金处理等一致性没有极高的要求,它应该没问题。整体表现应该不错。

  2. 受影响的缓存条目的同步失效与跨越缓存失效和数据库更新的事务。性能明智这是自杀 :) 如果无法将数据持久保存到数据库,则此处的事务很重要,您最终可能会在缓存中得到错误的数据。

  3. 关闭所有可能受到影响的事务数据的缓存。您的在线部分的性能将受到影响。3A)一旦批处理完成,您可以决定为缓存放置一些预热逻辑。3B

  4. 在维护窗口中运行批处理。您的在线申请将在此期间关闭。您可能会节省开发时间:)

  5. 使用您的缓存作为主要数据存储,然后放置一个后台进程将其与数据库同步。您可能需要一定数量的复制以确保不会丢失数据。一些缓存也提供磁盘持久性。

如果您批处理并且您的 Web 应用程序单独运行,会发生什么情况。这是一个可以通过两种方式解决的问题:

  1. 您使用像 hazelcast 或 infinispan 这样的缓存服务器。单独的 Ehcache 不是一个服务器,您需要在顶部安装 terracota 才能使其成为服务器。
  2. 或者你保留 ehcache,然后你需要在你的 webb 应用程序中构建一个用于缓存失效的接口。例如,您可以使用队列发送失效消息广告,然后使用它们并处理它们。

推荐阅读