【问题标题】:multiple session factories, one connection?多个会话工厂,一个连接?
【发布时间】:2011-01-06 23:27:10
【问题描述】:

为了避免 XA 开销,我在项目 A 中添加了一些表名前缀,并将其推出到与项目 B 相同的 mysql 数据库中,这样我就可以使用相同的连接 - 并希望获得完整的原子性等。

虽然项目 A 和 B 具有非常不同的会话工厂配置。我为项目 B 配置了一个 HibernateTransactionManager,而 A 只是使用 TransactionSynchronizationManager.hasResource(sessionFactoryA) 加入事务的 OSiV 样式代码。

这在概念上有效吗?我只是在A中尝试了一个断点,然后等待,然后继续,超时导致B回滚,但A仍然提交!!?

什么给了?感谢您的帮助。

【问题讨论】:

  • 我意识到需要使用相同的连接......这让我想到,提供一个自定义的 hibernate.current_session_context_class 可以查找不同的 sessionFactory 以返回相同的连接怎么样?跨度>
  • 好的。 hibernate.current_session_context_class 不合适,但是 hibernate.connection.provider_class 合适!我可以实现这一点并让 getConnection "return staticSessionFactoryB.getCurrentSession().connection();"我的设置不需要内部事务等,并且默认 on_close 会话的连接在 tx 端工作,所以一切看起来都很好。我有一个真正的共享资源。如果您看到任何叮当声,请通知我!也许这就是帕斯卡在下面提到的?

标签: java hibernate spring sessionfactory


【解决方案1】:

即使两组实体都驻留在同一个数据库中,您仍然为 Spring 配置了两个不同的事务管理器。因此,您最终会得到重叠但完全独立的事务,每个事务使用不同的数据库连接。

为了让事务正常工作,您需要使用一个事务管理器,并通过它发送所有事务操作。

【讨论】:

  • 谢谢 - 我意识到提供相同的数据源并不意味着使用相同的连接。一个事务就可以了(A 背负着 B 使用 aop 的 tx 方法)但是 HibernateTransactionManger 只管理一个工厂,因此只有一个数据源......所以我必须全力以赴 - 并且有 jta 事务管理器和 XA mysql 驱动程序? ??
  • 要么使用 JTA,要么将你的会话工厂合并到一个配置中。
【解决方案2】:

以您当前的设置,恐怕您需要JtaTransactionManager12.2.8. Transaction management strategies 部分)。如果您想避免使用 XA,则需要使用单一且唯一的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多