当前位置: 首页 > 面试题库 >

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

戚育
2023-03-14
问题内容

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

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

当前不涉及内部jvm缓存-因此我们手动用信号通知另一个jvm。

现在,当webapp更改某些数据时,它会通知服务器重新加载更改的数据。我们发现,我们需要告诉休眠状态清除数据,然后重新加载它。仅对数据库执行获取/合并操作并不能完成工作-主要是针对层次结构下几层的对象。

任何关于此设计是否存在根本错误的想法,或者是否有人正在这样做,并且最好在重新加载时使用休眠模式,这会给您带来好运。


问题答案:

Hibernate会话将从数据库读取的所有数据加载到他们称为第一级缓存的位置。从数据库加载行后,对于具有相同PK的行的任何后续提取都将返回此缓存中的数据。此外,休眠的保证人在单个会话中引用具有相同PK的对象的相等性。

据我了解,您的只读服务器应用程序永远不会关闭其Hibernate会话。因此,当数据库由读写应用程序更新时,只读服务器上的Session不会意识到更改。实际上,您的只读应用程序正在加载数据库的内存中副本并使用该副本,该副本在适当的时候会过时。

我建议的最简单,最好的操作方法是根据需要关闭和打开会话。这回避了整个问题。休眠会话旨在成为与数据库进行短暂交互的窗口。我同意通过不一次又一次地重新加载对象图来提高性能。但是您需要对其进行衡量,并说服自己,值得付出痛苦。

另一个选择是定期关闭并重新打开会话。这样可以确保只读应用程序可以处理不超过给定时间间隔的数据。但是肯定有一个窗口,其中只读应用程序可以处理过时的数据(尽管设计保证了它最终将获取最新数据)。在许多应用程序中这可能是允许的-您需要评估自己的情况。

第三种选择是使用二级缓存实现,并使用短暂的会话。与Hibernate一起使用的缓存程序有很多,各有优缺点。



 类似资料:
  • 问题内容: 我试图确保脚本仍在开发服务器上运行。它整理统计数据并提供Web服务,因此应该可以持续使用,但是一天几次,它会由于未知原因而死掉。当我们注意到我们只是再次启动它时,但是后部很痛苦,有些用户没有权限(或专有技术)来启动它。 我内的程序员想花几个小时来解决问题的根源,但内心的忙碌的人认为必须有一种简便的方法来检测应用程序是否未运行,然后重新启动它。 我知道我 可以 通过grep cron-s

  • 当测试/调试Java应用程序时,如何将断点放在某个被抓住的地方,而不挂起整个应用程序? 我有一个简单的Spring Boot应用程序,当我在我的IntelliJ社区集成开发环境中的某个地方设置断点时,整个应用程序会挂起。 我如何允许应用程序运行,即使我持有一个线程? 我能从两个试图同时登录的用户那里同时获得两个断点吗?

  • 问题内容: 我希望我的应用程序检查自身的另一个版本是否已在运行。 例如,启动后,用户单击以再次运行它,但是第二个实例意识到“哦,等等,已经在运行中”。并退出并显示一条消息。 问题答案: 您所寻找的内容可能最好用锁定文件来完成。锁定文件仅是指具有预定义位置且存在您的互斥体的文件。 测试程序启动时该文件是否存在,如果存在,请立即退出。在已知位置创建文件。如果程序正常退出,请删除锁定文件。 最好的办法是

  • ...有点。正如这个极其简单的例子所示, 我的一个应用程序很少以这种方式崩溃(到目前为止只报告过一次)。当一个不确定的异常发生时,我想像往常一样终止它。我的策略是(低级)记录问题,然后终止。应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它。它是用C -Builder 6构建的,在Windows (XP)上运行...7,也是8)。我了解到< code>abort()很可能导致了这个错

  • null (如果可能的话,它应该在db中创建表并生成html文件。我看到了http://velocity.apache.org/,所以是否可以使用它生成java代码。)

  • 问题内容: 第一部分 在Grails应用程序中,我了解到您可以通过添加以下方式为每个域类启用二级缓存 默认情况下,仅在调用时使用二级缓存,但也可以通过添加到查询将其用于条件查询和动态查找器。 但是,我仍然不确定我是否了解查询缓存的工作原理。我最好的猜测是: 每个域类都有单独的查询缓存,例如一个用于Book,另一个用于Author 在执行类似的查询之前,将根据域类(Author),查询(findBy