Java 如何将JTA事务与两个数据库一起使用?
App1使用App2公开的一些客户端api与App2(EJB应用程序)交互。在Jboss中使用CMT管理的JTA事务。我们使用JNDI查找从App2(Jboss)获取UserTransactionJava 如何将JTA事务与两个数据库一起使用?,java,spring,jboss5.x,jta,distributed-transactions,Java,Spring,Jboss5.x,Jta,Distributed Transactions,App1使用App2公开的一些客户端api与App2(EJB应用程序)交互。在Jboss中使用CMT管理的JTA事务。我们使用JNDI查找从App2(Jboss)获取UserTransaction App1调用App2,使用UserTransaction的begin()和commit()将数据插入DS2 App1使用Hibernate JPA调用DS1,以使用JPATransaction Manager将数据插入DS1 是否可以在单个事务(分布式事务)中包装以上两个DB操作 PFB描述需求的图像
UserTransaction的begin()和commit()
将数据插入DS2PFB描述需求的图像要做到这一点,必须实现您自己的事务资源,能够加入正在进行的JTA事务。关于一些指导原则,请参见本文。了解如何实现这一点的一种方法是查看数据库或JMS资源的XA驱动程序代码,并以此为基础 这不是一件小事,也是一个非常罕见的用例,通常通过采用替代设计在实践中解决。一种方法是将必要的代码从App2提取到一个jar库中,并在Tomcat中与一个JTA事务管理器(如Atomikos)一起使用,该事务管理器连接到两个XA JTA数据源 另一种方法是在向JBoss发送同步调用之前,将SQL语句刷新到tomcat中的数据库中,并查看是否有效,如果JBoss中的事务成功,则返回结果 取决于tomcat中的提交/回滚。这并不保证在100%的情况下(网络故障等)都能正常工作,但根据系统的功能和失败事务的业务后果,这可能是可以接受的 另一种方法是在JBoss端使操作可恢复,并公开tomcat在检测到错误时使用的补偿服务。对于这两个服务器JBoss,您可以利用JBoss引擎,另请参见此
哪种方式更好取决于用例,但是实现您自己的XA事务服务是一项艰巨的任务,我认为更改设计会更简单。很少有项目这样做的原因是它很复杂,而且有更简单的替代方案 Tomcat是一个Web服务器,因此它不支持全局事务 JBoss是一个应用服务器,因此它支持全局事务 如果必须将两者结合使用,则必须使用JOTM或ATOMIKOS,它们充当事务管理器和提交或回滚