为什么我的EntityManager获取过时的数据库对象

时间:2016-04-04 13:20:04

标签: tomcat eclipselink entitymanager

情况:

  • App A(战争在tomcat 7上运行,Web应用程序的休息界面)
  • App B(java独立,计划批处理作业将数据从文件加载到数据库中)
  • 在具有每个文件记录的共享控制表之间。
  • App A在控制表中正确保留新记录并设置适当的状态(待处理),通知App B开始处理。
  • 网络应用正确地将状态显示为待处理状态。
  • App B处理该批处理,加载数据并正确设置负载已完成的新状态(已处理)信号。通过fx Squirrel的简单查询可以很容易地验证这一点。
  • 在Web应用程序中刷新页面时,状态错误地显示为挂起而不是正确的状态:已处理。调试响应时,状态变量被指定为挂起。我的日志表明在刷新时发生了查询。
  • 如果我重新启动我的Tomcat,下一个查询将显示正确的结果,即处理状态。这也让我感到困惑,除了EntityManager还在维护数据库对象?

问题: 我只是无法弄清楚为什么App A继续将状态视为未决状态。我已经尝试过许多方法来确保entityManager清除了它(包括App A和App B)但仍然App A查询最终得到了错误的状态。

2 个答案:

答案 0 :(得分:0)

@Baldurian 谢谢你的提示。我在获取的对象上添加了一个刷新并且它有效。我通过子对象得到我的状态。事实证明,即使App A在每次查询之前清空了缓存,也永远不会刷新子对象。不完全是我期待的行为。

答案 1 :(得分:0)

默认情况下,EclipseLink维护一个second level cache,它位于EntityManager之外,为什么清除EntityManager缓存没有帮助。

您可以如上所述进行刷新,但这需要了解何时进行更改以便了解何时需要刷新 - 并且需要注意刷新消除更改。

如果您经常在此JPA应用程序之外进行更改,则最好在某些或所有实体上禁用共享缓存。 <property name="eclipselink.cache.shared.default" value="false"/>属性可用于为所有实体禁用它,或者您可以使用@Cache注释选择性地选择