从批处理端更新数据库时,在Webapp端刷新Hibernate缓存级别2

时间:2019-02-08 18:05:38

标签: java performance hibernate jpa caching

我有一个webapp应用程序,并且有多个批处理编辑同一数据库。

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

正在运行批处理以更新同一数据库,并使用其自己的ehcache配置ehcache.xml。

因此,webapp和批处理不会共享同一区域的缓存。

我的问题是,当批处理更新数据库时,我的webapp视图未更新。此行为是正常的,因为在Webapp端未完成缓存上的实体到期。刷新后视图将更新。

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

Thx

2 个答案:

答案 0 :(得分:0)

没有最佳实践解决方案。您有几种变体,具体取决于您可以容忍缓存变冷的时间以及对无效缓存条目的容忍度。 另一个标准是您要更新哪种数据。是交易数据(Money吗?)还是您每天更新一次而正确性并不重要的东西。我想将您的批处理应用程序与Web应用程序一起部署。这种压力很重要,因为您需要能够从批处理连接到休眠的二级缓存以发送无效消息。

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

  2. 受影响的缓存条目的同步失效,并且事务跨越整个缓存失效和数据库更新。在性能方面,这很容易自杀:)如果无法将数据持久存储到数据库中,可能会导致缓存中的数据错误,因此此处的事务很重要。

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

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

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

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

  1. 您使用诸如hazelcast或infinispan之类的缓存服务器。单独的Ehcache并不是服务器,您需要在顶部使用terracota使其成为服务器。
  2. 另外,您也可以保留ehcache,然后需要在webb应用程序中构建一个接口以使缓存失效。例如,您可以使用队列发送失效消息广告,然后使用它们并进行处理。

答案 1 :(得分:0)

我的Web应用程序已部署到Tomcat容器中。它有自己的ehcache.xml来配置区域缓存。

对于我的浴袍,有一个基于crontable的触发器,可以整夜触发整个批次。但这是在TomCat之外。在配置自己的区域缓存时,它还具有自己的ehcache.xml。