java - 如何保持运行两个 Java 应用程序的 Hibernate 缓存一致性?

标签 java hibernate caching

我们的设计有一个 jvm,它是一个 jboss/webapp(读/写),用于通过 hibernate (使用 jpa)将数据维护到数据库。该模型有 10-15 个持久类,关系深度为 3-5 个级别。

然后我们有一个单独的 jvm,它是使用这些数据的服务器。由于它持续运行,我们只有一个长数据库 session (只读)。

目前不涉及内部 jvm 缓存 - 因此我们手动从一个 jvm 发出信号。

现在,当 webapp 更改某些数据时,它会向服务器发出信号以重新加载更改后的数据。我们发现我们需要告诉 hibernate 清除数据然后重新加载它。仅仅对数据库进行获取/合并并不能完成这项工作——主要是关于层次结构中几层的对象。

关于此设计是否存在任何根本性错误的任何想法,或者是否有人正在这样做并且在重新加载时使用 hibernate 时运气更好。

谢谢, 克里斯

最佳答案

Hibernate session 将它从数据库读取的所有数据加载到他们所谓的一级缓存。一旦从数据库中加载了一行,对具有相同 PK 的行的任何后续提取都将从该缓存中返回数据。此外,Hibernate 保证在单个 session 中为具有相同 PK 的对象引用相等性。

据我了解,您的只读服务器应用程序永远不会关闭其 Hibernate session 。因此,当读写应用程序更新数据库时,只读服务器上的 session 不知道更改。实际上,您的只读应用程序正在加载数据库的内存中副本并使用该副本,该副本会在适当的时候变得陈旧。

我可以建议的最简单和最好的行动方案是根据需要关闭和打开 session 。这回避了整个问题。 Hibernate Sessions 旨在成为与 DB 进行短暂交互的窗口。我同意通过不一次又一次地重新加载对象图来提高性能;但你需要衡量它并说服自己这是值得的。

另一种选择是定期关闭和重新打开 session 。这可确保只读应用程序使用不早于给定时间间隔的数据。但是肯定有一个窗口,只读应用程序可以在其中处理陈旧数据(尽管设计保证它最终会获得最新数据)。这在许多应用程序中可能是允许的 - 您需要评估您的情况。

第三种选择是使用二级缓存实现,并使用短暂的 session 。有各种与 Hibernate 一起工作的缓存包,各有优缺点。

关于java - 如何保持运行两个 Java 应用程序的 Hibernate 缓存一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48733/

相关文章:

java - dotCMS插件开发

java - 读写文件 - Java 和 Android

java - JPA 与 Hibernate 5 : programmatically create EntityManagerFactory

java - 回滚事务的常见异常处理

java - 在hibernate createSQlquery结果中使用sql列名

android - ENOTEMPTY : directory not empty, rmdir '/tmp/react-native-packager-cache-02b2ace9b81fa119b172fdfd36d3a3b4e4156b70/cache'

java - 使用 Java 将徽章气泡放置在按钮的左上角

java - 如何在 RecyclerView 的一项中找到两个文本 block ?

ruby-on-rails - 设置一个集合缓存键而不需要多次后续查询

http - 利用服务器端缓存进行 CSRF 保护