我有两个不同的应用程序共享同一个数据库。问题是,当我有一个应用程序在数据库中更改某些内容时,另一个不会更新。
我试图制作一个session.flush()
,但它没有用。唯一的方法是关闭整个会话并重新创建它,但当然,这需要太长时间。
答案 0 :(得分:2)
简短回答:每次要显示某个对象时发出session.refresh(obj)
。它将强制Hibernate转到数据库。另一种解决方案是使用StatelessSession
,它不会缓存任何内容(甚至不是一级缓存),每次需要记录时都会强制应用程序进入数据库:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession
但是,当然,如果那太多了,那么你可以考虑使用某种锁定(悲观或乐观):
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-optimistic
但实际上,如果你有两个不同的并发系统使用相同的记录,那么Hibernate本身就无法解决。您应该在系统架构中考虑这一点。
答案 1 :(得分:1)
如果我理解正确,这就是你的场景中发生的事情:
如果是这种情况,您需要检查数据库Isolation levels。
当您想要阅读更新的数据时,您当然可以开始新的交易。查看Hibernate transactions documentation
答案 2 :(得分:0)
我没有测试过这个,但是Session类有一个清除所有已加载实体的方法。这应该强制从db重新加载。
答案 3 :(得分:0)
对我来说,它可以提交当前事务,并在另一个应用程序应用其修改后开始一个新事务。