2017-03-13 38 views
0

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

比方说,我有这样的:

@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数据源JPA查询1.
  • MySecondEjb做使用XA数据源2.
  • JPA查询

我正在使用XA数据源,因为这些EJB可用于其他情况下2PC i (与其他数据源或JMS提供者一起)。

我现在想区分几种情况:同一个应用程序服务器中

  1. MyFirstEjb和MySecondEjb部署在同一个应用程序(EAR)
  2. MyFirstEjb和MySecondEjb部署在独立的应用程序(EAR)

    0:
  3. MyFirstEjb和MySecondEjb被不同的应用程序的服务器

而子情形内展开

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

感谢

回答

1

这取决于。

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

在事务终止期间,JTA准备好每个XAResource,并在此处优化开始。如果数据库引擎检测到它具有多个分支(connections/XAResources),那么它可能会返回PREPARED第一个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

注意的是,根据供应商,“数据库引擎”和“数据库”不完全是一回事。一些系统将在同一台服务器上托管多个dbs,并允许优化跨越它们,而另一些系统可能将每个视为单独的事务引擎范围,而不是优化这些情况。数据源也可能仅在用于连接的用户标识/模式上有所不同,依赖于权限/模式名称空间来隔离应用程序,而不需要为此目的设置不同的数据库。优化几乎总是适用于这种情况。

在某些情况下,该应用程序使用相同的XADataSource,JCA的注册只是一个与JTA XA资源,可能允许它使用更激进1PC优化来代替。

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

+0

哇...谢谢你对这个详细的解释和这些重要的链接!这是非常有趣的,并且使它更加清晰,即使这是一个复杂的主题。 它确认优化是供应商特定的。 非常感谢 –

1

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

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

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

2。MyFirstEjb和MySecondEjb被部署在同一个应用程序服务器

如果部署在同一应用程序服务器上,但与的.ear客户端访问他们槽远程接口不同内的单独的应用程序(耳),因此每一个启动一个完全不同的线程/事务(REQUIRES_NEW)。如果出现问题,客户端将得到一个EJBException。从客户角度来看,没有全球交易。

3.MyFirstEjb和MySecondEjb被不同的应用服务器

如果EJB部署不同的应用服务器上的应用同样中部署。他们通过一个远程接口访问,因此他们每个人都开始一个全新的交易。

+0

感谢您接受这些补充说明。 事实上,如果驱动程序未配置为加入全局事务,您将得到一个XAException。 但你不回答我关于优化的主要问题。我发现了一个有趣的帖子([link](http://integrationspot.blogspot.fr/2011/03/jta-transactions-local-and-global.html)),它表示“XA数据源可以支持两阶段提交协调,**以及本地事务**“+”应用程序服务器执行**“唯一资源优化”**并与RMLT中的资源管理器交互。“ 它的工作方式是? –

+0

还有这个答案[http://stackoverflow.com/questions/5130934/jta-datasources-without-transactions#answer-5452025](http://stackoverflow.com/questions/5130934/jta-datasources-without- transactions#answer-5452025)这很有趣:“完全有可能通过支持XA的资源启动非XA事务,并在本地提交它”。但是,访问相同的数据源并依赖于JTA和EJB CMT会发生什么? –