我遇到了一个奇怪的场景——我有两个休眠实例(比如 A 和 B)由两个单独的 JVM 进程运行——请不要问为什么,但我必须这样做。当A提交(trans.commit())并写入MySql中的表T然后当B从T读取相同的记录时,它会得到陈旧的数据。
A 和 B 每个都有一个会话对象,比如 sessionA 和 sessionB。因此,没有调用新的 openSession()。
谁能告诉我为什么会这样?
肯定需要有关事务边界和缓存设置的更多信息。要确定这是否是缓存问题,请在实例 B 读取实例 A 写入的数据之前运行以下代码:
session.getSessionFactory().getCache().evictCollectionRegions();
session.getSessionFactory().getCache().evictDefaultQueryRegion();
session.getSessionFactory().getCache().evictEntityRegions();
session.getSessionFactory().getCache().evictQueryRegions();
这会驱逐所有配置的缓存。如果之后对 B 的读取有效,那么您在实例之间存在缓存问题(可能)。如果 B 上的读取仍然不起作用,我将通过终端检查数据库以确保 A 的数据已提交。
您使用哪个数据库引擎在 MySQL 中创建数据库。如果您使用InnoDB作为数据库引擎,请将其更改为MyISAM。这是创建多个休眠 SessionFactory 实例时最常见的问题之一。如果您正在使用二级缓存,有人会认为这可能是一个问题,但事实并非如此。因此,更改数据库引擎肯定会帮助您解决问题。
告诉我它是否对你有用。如果这不起作用,我将提供其他解决方案。
关于其他替代方案:如果您使用 Hibernate 作为您的 ORM(对象关系映射)工具,那么您可以在 hibernate 文档中检查LockOptions 。您可以在插入然后从数据库中检索的实体上使用LockMode.Upgrade 。
摘要:查看休眠中的LockOptions并在这种情况下应用LockMode 升级。
如果您仍然遇到任何问题,请发布。希望它能为您解决问题。
谢谢。