2010-01-19 159 views
2

为了避免XA开销,我从前缀项目中的一些表名和滚出来是一样的mysql数据库是项目B的内部,所以我可以使用相同的连接 - 并希望得到全原子等多个会话工厂,一个连接?

A计划和B虽然有非常不同的会话工厂配置。我为项目B配置了HibernateTransactionManager,而A仅使用 TransactionSynchronizationManager.hasResource(sessionFactoryA) OSiV样式代码与事务一起使用。

这是否在工作原理?我刚刚在A中尝试了一个断点,然后等待,然后继续,超时导致B回滚,但A仍然提交!!?

什么给?谢谢你的帮助。

+0

我意识到需要使用相同的连接....这让我想到了,如何提供一个自定义的hibernate.current_session_context_class,它可以查找不同的sessionFactory来返回相同的连接? – adam 2010-01-20 17:20:58

+0

好的。 hibernate.current_session_context_class不合适,但hibernate.connection.provider_class是!我可以实现这一点,并getConnection“返回staticSessionFactoryB.getCurrentSession()。连接();” 我的设置不需要内部事务等,并且默认的on_close会话的连接在tx结束,因此一切似乎都很好。我有一个真正的共享资源。请告诉我,如果你看到任何clangers!也许这是帕斯卡尔在下面提到的? – adam 2010-01-20 22:45:36

回答

2

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

为了使交易正常运行,您需要使用一个交易管理器,并通过它发送所有交易操作。

+0

谢谢 - 我意识到提供相同的数据源并不意味着使用相同的连接。一个事务会很好(使用aop在B的tx方法中搭载),但HibernateTransactionManger只管理一个工厂,因此只管理一个数据源...因此,我将不得不整个猪群 - 还有jta事务管理器和XA mysql驱动程序? ?? – adam 2010-01-20 17:15:50

+0

使用JTA,或将会话工厂合并到一个配置中。 – skaffman 2010-01-20 17:24:04