我们的设计有一个jvm,它是一个jboss/webapp(读/写),用于通过hibernate(使用jpa)维护数据到db.该模型具有10-15个持久类,在关系中具有3-5个深度级别.
然后我们有一个单独的jvm,它是使用这些数据的服务器.当它连续运行时,我们只有一个长db会话(只读).
目前没有涉及jvm内部缓存 - 所以我们手动发信号通知另一个jvm.
现在,当webapp更改某些数据时,它会通知服务器重新加载已更改的数据.我们发现我们需要告诉hibernate清除数据然后重新加载它.只是对数据库进行提取/合并不起作用 - 主要是关于层次结构中几层的对象.
关于这个设计是否存在根本性错误的任何想法,或者是否有人这样做,并且在重新加载时使用hibernate有更好的运气.
谢谢,克里斯
Hibernate会话将从DB读取的所有数据加载到它们称为第一级缓存的数据中.从DB加载行后,具有相同PK的行的任何后续提取都将从此缓存返回数据.此外,Hibernate gaurentees在单个Session中引用具有相同PK的对象的相等性.
根据我的理解,您的只读服务器应用程序永远不会关闭其Hibernate会话.因此,当读写应用程序更新数据库时,只读服务器上的会话不知道更改.实际上,您的只读应用程序正在加载数据库的内存副本并使用该副本,该副本在适当的时候会变得陈旧.
我建议的最简单和最好的行动方案是根据需要关闭并打开Sessions.这避免了整个问题.Hibernate Sessions旨在成为与DB短暂交互的窗口.我同意不再一次又一次地重新加载对象图表会带来性能提升; 但是你需要测量它并说服自己这是值得的.
另一种选择是定期关闭并重新打开会话.这可确保只读应用程序使用不早于给定时间间隔的数据.但肯定有一个窗口,其中只读应用程序使用陈旧数据(虽然设计保证它最终获得最新数据).在许多应用程序中这可能是允许的 - 您需要评估您的情况.
第三种选择是使用二级缓存实现,并使用短期的Sessions.有各种缓存包与Hibernate一起使用,具有相对优点和缺点.