为什么我的 EntityManager 正在获取过时的数据库对象
Why my is EntityManager fetching outdated database object
情况:
- App A(war 运行 on a tomcat 7, web app 的 rest 接口)
- 应用程序 B(java 独立的计划批处理作业将文件中的数据加载到数据库中)
- 在共享控件 table 之间,每个文件有一条记录。
- App A 正确地将新记录保存在控件中 table 并设置适当的状态(挂起),向 App B 发出信号以开始处理。
- Web 应用程序正确显示状态为挂起。
- App B 处理批处理、加载数据并正确设置新状态(已处理),表示加载已完成。这可以通过使用 fx Squirrel 的简单查询轻松验证。
- 在网络应用程序中刷新页面时,状态错误地显示为待处理,而不是正确的状态:已处理。调试响应时,状态变量被分配为挂起。我的日志表明查询发生在刷新时。
- 如果我重新启动 Tomcat,下一个查询将显示正确的结果,即处理后的状态。这也让我很疑惑,EntityManager除了维护数据库对象还有什么??
问题:
我只是不明白为什么 App A 继续将状态视为未决。我已经尝试了很多方法来确保 entityManager 已清除缓存(对于应用程序 A 和应用程序 B),但应用程序 A 查询最终仍会获得错误的状态。
@Baldurian
感谢提示。我在获取的对象上添加了刷新并且它起作用了。我通过子对象获取状态。事实证明,即使 App A 在每次查询之前清空了缓存,子对象也从未被刷新。不完全是我预期的行为。
EclipseLink 默认维护一个 second level cache,它在 EntityManager 之外,为什么清除 EntityManager 缓存没有帮助。
您可以如上所述进行刷新,但这需要了解何时进行更改,以便您知道何时需要刷新 - 并且需要小心,因为刷新会清除更改。
如果您要经常在此 JPA 应用程序之外进行更改,最好禁用部分或所有实体上的共享缓存。 <property name="eclipselink.cache.shared.default" value="false"/>
属性 可用于为所有实体禁用它,或者您可以使用 @Cache 注释
有选择地挑选
情况:
- App A(war 运行 on a tomcat 7, web app 的 rest 接口)
- 应用程序 B(java 独立的计划批处理作业将文件中的数据加载到数据库中)
- 在共享控件 table 之间,每个文件有一条记录。
- App A 正确地将新记录保存在控件中 table 并设置适当的状态(挂起),向 App B 发出信号以开始处理。
- Web 应用程序正确显示状态为挂起。
- App B 处理批处理、加载数据并正确设置新状态(已处理),表示加载已完成。这可以通过使用 fx Squirrel 的简单查询轻松验证。
- 在网络应用程序中刷新页面时,状态错误地显示为待处理,而不是正确的状态:已处理。调试响应时,状态变量被分配为挂起。我的日志表明查询发生在刷新时。
- 如果我重新启动 Tomcat,下一个查询将显示正确的结果,即处理后的状态。这也让我很疑惑,EntityManager除了维护数据库对象还有什么??
问题: 我只是不明白为什么 App A 继续将状态视为未决。我已经尝试了很多方法来确保 entityManager 已清除缓存(对于应用程序 A 和应用程序 B),但应用程序 A 查询最终仍会获得错误的状态。
@Baldurian 感谢提示。我在获取的对象上添加了刷新并且它起作用了。我通过子对象获取状态。事实证明,即使 App A 在每次查询之前清空了缓存,子对象也从未被刷新。不完全是我预期的行为。
EclipseLink 默认维护一个 second level cache,它在 EntityManager 之外,为什么清除 EntityManager 缓存没有帮助。
您可以如上所述进行刷新,但这需要了解何时进行更改,以便您知道何时需要刷新 - 并且需要小心,因为刷新会清除更改。
如果您要经常在此 JPA 应用程序之外进行更改,最好禁用部分或所有实体上的共享缓存。 <property name="eclipselink.cache.shared.default" value="false"/>
属性 可用于为所有实体禁用它,或者您可以使用 @Cache 注释