XA数据源1PC优化

时间:2017-03-13 16:06:45

标签: 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 MySecondEjb second;

   // Transactional processing
   public void process() {
      first.processJpaStuff();
      second.processJpaStuff();
   }
}

让我们说:

  • MyFirstEjb使用XA Datasource 1执行JPA查询。
  • MySecondEjb使用XA Datasource 2执行JPA查询。

我正在使用XA数据源,因为这些EJB可用于需要2PC的其他情况(以及其他数据源或JMS提供程序)。

我现在想区分几种情况:

  1. MyFirstEjb和MySecondEjb部署在同一个应用程序(EAR)中
  2. MyFirstEjb和MySecondEjb部署在同一应用程序服务器中的单独应用程序(EAR)中
  3. MyFirstEjb和MySecondEjb部署在不同的应用程序服务器中
  4. 和子案例:

    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 / ...)链接解释这个? 所有应用程序服务器/实现都是一样的吗?

    由于

2 个答案:

答案 0 :(得分:1)

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

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

对于其他情况,除了理想情形之外,处理两个数据源的业务层和所有客户处理业务层(应该避免处理相同数据源的不同应用程序)。这就是可能发生的事情。

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

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

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

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

答案 1 :(得分:1)

取决于。

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

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

http://narayana.io/docs/product/#two-phase-variants

https://docs.oracle.com/cd/B10501_01/java.920/a96654/xadistra.htm#1061004

请注意,取决于供应商,' db engine'和'数据库'并不完全一样。某些系统将在同一服务器上托管多个dbs并允许优化在它们之间工作,而其他系统可能将每个dbs视为单独的事务引擎范围而不是优化此类情况。数据源也可能仅在用于连接的用户标识/模式方面有所不同,依赖于权限/模式命名空间来隔离应用程序,而不需要用于此目的的不同数据库。优化几乎总是适用于这种情况。

在某些情况下,应用程序使用相同的XADatasource,JCA只注册一个带有JTA的XAResource,可能允许它使用更具侵略性的1PC优化。

虽然连接可以在本地和XA事务上下文之间切换,但JTA目前无法利用这一点。由于资源仅在需要时被征募,因此系统在到达终止阶段之前不知道将有多少人参与交易。 JTA规范组之前已经讨论了允许配置,类似于设置tx超时的方式,这将允许应用程序在开始时指示tx预期是单个资源,或者更一般地说列出XAResources是什么。预计包含。该信息将允许JTA在本地tx模式下驱动资源而不是在适当的情况下驱动XA模式,从而忽略开始/结束/准备协议调用。通过在应用程序中为同一数据库部署XA和非XA数据源,还可以消除手动优化此类情况的需要。目前它还不在路线图上。