XA Datasource 1PC optimization



我正在与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 DataSource2。

我正在使用XA DataSource,因为这些EJB可以在需要2pc的其他情况下使用(以及另一个DataSource或JMS提供商)。

我现在想区分几种情况:

  1. myfirstejb和mysecondejb被部署在同一应用程序(ear)
  2. myfirstejb和mysecondejb被部署在同一应用程序服务器中的单独应用程序(EARS)中
  3. myfirstejb和mysecondejb被部署在不同的应用程序服务器中

和子案例:

a)XA DataSource 1 = XA DataSource 2

b)XA DataSource 1!= XA DataSource 2(相同数据库)

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

我想b)和c)以相同的方式管理。有一个全局交易,每个数据源与XA交易管理器合作。应用2pc。

案例1.a)和2.a)?由于两者最终都使用了相同的数据源,因此我想有某种优化不需要全局2PC交易?如果是,是否有任何官方(JTA/JBOSS/...)链接可以解释这一点?所有应用程序服务器/实现都一样吗?

谢谢

它取决于。

JTA(交易协调员)对EJB或应用程序一无所知。它仅与Xaresources和相关的交易分支有关。通常情况下,JCA管理JPA用于实体beans使用的连接池,将为JTA提供每个数据源的一个Xaresource。JTA在相同的全局TX ID下分配了不同的分支预选赛。

在交易终止期间,JTA准备每个Xaresource,此时优化开始了。如果DB引擎检测到其具有多个分支(Connections/Xaresources)的同一全局TX,则可以从第一个部门返回准备返回Xaresource,但从其余资源中读取。假设TX的结果只有一个准备好的资源,其余的都是只读的资源,那么它可以相应地优化终止的其余部分。参见例如

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

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

请注意,取决于供应商," DB引擎"one_answers"数据库"并非完全相同。某些系统将在同一家服务器上托管多个DB,并允许优化跨越它们,而另一些系统可以将每个DB视为单独的事务引擎范围,而不是优化此类情况。数据源也可能仅在用于连接的用户ID/架构上有所不同,依赖于权限/模式名称命名命名将应用程序隔离应用程序,而无需为此目的提供不同的数据库。在这种情况下,优化几乎总是有效的。

在某些情况下,应用程序使用相同的Xadatasource,JCA仅使用JTA寄存一个Xaresource,可能允许其使用更具侵略性的1PC优化。

确实可以在本地和XA事务上下文之间切换连接,但JTA目前不可能利用这一点。由于资源仅按需征募,因此该系统不知道有多少将在交易达到终止阶段。JTA规格组先前已经讨论过允许配置,类似于TX超时的设置方式,这将允许该应用程序在开始时指出TX有望是单个资源,或者更一般地列出了预期的Xaresources。该信息将允许JTA以本地TX模式而不是XA模式驱动资源,从而使开始/结束/准备协议调用。它还将消除通过在应用程序中为同一数据库部署XA和非XA数据量来手动优化此类情况的需求。它目前不在路线图上。

1.MyFirstejb和mySecondejb被部署在同一应用程序(EAR)

当数据源不同时,您可能知道,如果驱动程序和基础数据源无法加入全局事务,或者如果未配置驱动程序以加入全局交易,则您将获得特定的错误。p>在其他情况下,除了理想的方案是处理数据源和所有客户端处理业务层的业务层(完全应避免使用相同数据源的不同应用程序)。这就是可能发生的。

2.MyFirstejb和MySecondejb被部署在同一应用程序服务器中的单独应用程序(EARS)中

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

3.MyFirstejb和MySecondejb被部署在不同的应用程序服务器中

如果将EJB部署在不同的应用程序服务器上,则同样应用。它们被访问了一个远程接口,因此他们每次启动全新的交易。

最新更新