通过两个不同的JVM进程异常分离Hibernate实例

时间:2013-02-16 05:47:56

标签: java linux hibernate

我遇到了一个奇怪的场景 - 我有两个hibernate实例(比如A和B)由两个独立的JVM进程运行 - 请不要问为什么,但我必须这样做。当A提交(trans.commit())并写入MySql中的表T时,当B从T读取相同的记录时,它会获得过时的数据。

A和B每个都有一个会话对象 - sessionA和sessionB。因此,没有调用新的openSession()。

任何人都可以提供一个线索,说明为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

当然需要有关事务边界和缓存设置的更多信息。要确定它是否是缓存问题,请在实例B读取数据实例A之前运行以下代码:

    session.getSessionFactory().getCache().evictCollectionRegions();
    session.getSessionFactory().getCache().evictDefaultQueryRegion();
    session.getSessionFactory().getCache().evictEntityRegions();
    session.getSessionFactory().getCache().evictQueryRegions();

这会驱逐所有已配置的缓存。如果之后对B的读取工作,则实例之间存在缓存问题(可能)。如果它上面的读取仍然不起作用,我会通过终端检查数据库以确保A的数据已被提交。

答案 1 :(得分:2)

您用于在MySQL中创建数据库的数据库引擎。 如果您使用 InnoDB 作为数据库引擎,请将其更改为 MyISAM 。 这是创建多个hibernate SessionFactory实例时最常见的问题之一。 有人会认为这可能是二级缓存的一个问题,如果你正在使用它,但事实并非如此。 因此,更改数据库引擎肯定会帮助您解决问题。

告诉我它是否适合你。 如果不起作用,我会提供其他解决方案。

答案 2 :(得分:2)

关于其他选择:如果您使用Hibernate作为ORM(对象关系映射)工具,那么您可以在hibernate文档中检查 LockOptions 。 您可以在插入的实体上使用 LockMode.Upgrade ,然后从数据库中检索。

摘要:在hibernate中查看 LockOptions ,并在这种情况下应用 LockMode 升级

如果您仍然遇到任何问题,请发布。 希望它能为您解决问题。

感谢。