Java XA数据源1PC优化

Java XA数据源1PC优化,java,transactions,ejb,jta,xa,Java,Transactions,Ejb,Jta,Xa,我正在使用JBoss EAP 6.4(Java EE 6),我有一个问题与应用程序服务器处理XA数据源的方式(通过EJB/JTA)以及是否始终使用2阶段提交(2PC)或是否应用了“优化”有关 假设我有这个: @Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) public class MyEjb { @EJB private MyFirstEjb first; @EJB private

我正在使用JBoss EAP 6.4(Java EE 6),我有一个问题与应用程序服务器处理XA数据源的方式(通过EJB/JTA)以及是否始终使用2阶段提交(2PC)或是否应用了“优化”有关

假设我有这个:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class MyEjb {
   @EJB
   private MyFirstEjb first;

   @EJB
   private MySecondEjb second;

   // Transactional processing
   public void process() {
      first.processJpaStuff();
      second.processJpaStuff();
   }
}
比如说:

  • MyFirstEjb使用XA数据源1执行JPA查询
  • MySecondEjb使用XA数据源2进行JPA查询
我之所以使用XA数据源,是因为这些EJB可以用于需要2PC的其他情况(以及其他数据源或JMS提供程序)

我现在要区分几种情况:

  • MyFirstEjb和MySecondEjb部署在同一个应用程序(EAR)中
  • MyFirstEjb和MySecondEjb部署在同一应用服务器中的不同应用程序(EAR)中
  • MyFirstEjb和MySecondEjb部署在不同的应用程序服务器中
  • 和子案例:

    a) XA数据源1=XA数据源2

    b) XA数据源1!=XA数据源2(同一数据库)

    c) XA数据源1!=XA数据源2(不同的数据库)

    我想b)和c)的管理方式是一样的。有一个全局事务,每个数据源都与XA事务管理器协作。应用了一个2PC

    那么案例1.a)和2.a)呢?由于两者最终都使用相同的数据源,我想有某种优化不需要处理全局2PC事务? 如果是,是否有任何官方链接(JTA/JBoss/…)解释这一点? 所有应用服务器/实现都是一样的吗


    谢谢。MyFirstEjb和MySecondEjb部署在同一个应用程序(EAR)中

    当数据源不同时,如您所知,如果驱动程序和基础数据源无法加入全局事务,或者如果驱动程序未配置为加入全局事务,则会出现特定错误

    对于其他情况,除此之外,理想的场景是业务层同时处理数据源,所有客户机都处理业务层(应避免使用处理相同数据源的不同应用程序)。这就是可能发生的事情

    2.MyFirstEjb和MySecondEjb部署在同一应用服务器内的不同应用程序(EAR)中

    如果部署在同一个应用服务器上,但使用不同的.ear,那么客户端将通过远程接口访问它们,因此每个应用服务器都会启动一个完全不同的线程/事务(需要新的)。如果出现问题,客户端将得到一个EJBException。从客户端的角度来看,没有全局事务

    3.MyFirstEjb和MySecondEjb部署在不同的应用服务器中


    如果ejb部署在不同的应用程序服务器上,则同样适用。它们通过远程接口访问,因此它们各自启动一个全新的事务。

    1.MyFirstEjb和MySecondEjb部署在同一个应用程序(EAR)中。

    当数据源不同时,如您所知,如果驱动程序和基础数据源无法加入全局事务,或者如果驱动程序未配置为加入全局事务,则会出现特定错误

    对于其他情况,除此之外,理想的场景是业务层同时处理数据源,所有客户机都处理业务层(应避免使用处理相同数据源的不同应用程序)。这就是可能发生的事情

    2.MyFirstEjb和MySecondEjb部署在同一应用服务器内的不同应用程序(EAR)中

    如果部署在同一个应用服务器上,但使用不同的.ear,那么客户端将通过远程接口访问它们,因此每个应用服务器都会启动一个完全不同的线程/事务(需要新的)。如果出现问题,客户端将得到一个EJBException。从客户端的角度来看,没有全局事务

    3.MyFirstEjb和MySecondEjb部署在不同的应用服务器中

    如果ejb部署在不同的应用程序服务器上,则同样适用。它们是通过远程接口访问的,因此它们各自启动一个全新的事务。

    视情况而定

    JTA(事务协调器)对EJB或应用程序一无所知。它只关注XAResources和关联的事务分支。通常情况下,管理JPA为实体bean使用的连接池的JCA将为JTA提供每个使用的数据源一个XAResource。JTA在相同的全局tx id下为每个分支分配不同的分支限定符

    在事务终止期间,JTA准备好每个XAResource,正是在这一点上开始优化。如果db引擎检测到它有多个分支(连接/XAResources)用于相同的全局发送,它可能会从第一个XAResource返回PREPARED,但只从剩余的资源中读取。假设tx因此只有一个准备好的资源,其余的都是只读的,那么它可以相应地优化终端的其余部分。见例

    请注意,根据供应商的不同,“db引擎”和“数据库”并不完全相同。一些系统将在同一台服务器上托管多个数据库,并允许在它们之间进行优化,而另一些系统可能将每个数据库视为单独的事务引擎范围,而不会对此类情况进行优化。数据源也可能仅在用于连接的userid/schema上有所不同,依赖于权限/schema名称空间来隔离应用程序,而不需要使用不同的数据库。在这种情况下,优化几乎总是有效的

    在某些情况下,应用程序使用相同的XADatasource,JCA只向JTA注册一个XAResource,这可能允许它使用更激进的1PC优化

    同时