Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JTA事务与两个数据库一起使用?_Java_Spring_Jboss5.x_Jta_Distributed Transactions - Fatal编程技术网

Java 如何将JTA事务与两个数据库一起使用?

Java 如何将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描述需求的图像

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描述需求的图像要做到这一点,必须实现您自己的事务资源,能够加入正在进行的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,它们充当事务管理器和提交或回滚