【问题标题】:XA Datasource 1PC optimizationXA 数据源 1PC 优化
【发布时间】:2017-03-13 16:06:44
【问题描述】:

我正在使用 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 提供程序)。

我现在想区分几种情况:

  1. MyFirstEjb 和 MySecondEjb 部署在同一个应用程序 (EAR) 中
  2. MyFirstEjb 和 MySecondEjb 部署在同一应用程序服务器内的不同应用程序 (EAR) 中
  3. 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 / ...)链接可以解释这一点? 所有应用服务器/实现都一样吗?

谢谢

【问题讨论】:

    标签: java transactions ejb jta xa


    【解决方案1】:

    视情况而定。

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

    在事务终止期间,JTA 准备每个 XAResource,此时优化开始。如果 db 引擎检测到它对同一个全局 tx 有多个分支(连接/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

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

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

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

    【讨论】:

    • 哇...感谢您的详细解释和这些重要链接!即使这是一个复杂的主题,它也非常有趣并且使它更加清晰。它确认优化是特定于供应商的。非常感谢
    【解决方案2】:

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

    当数据源不同时,您可能知道,如果驱动程序和底层数据源无法加入全局事务,或者驱动程序未配置为加入全局事务,您将收到特定错误。

    对于其他情况,除了理想的场景是业务层同时处理数据源并且所有客户端都处理业务层(应该完全避免不同的应用程序处理相同的数据源)。这是可能发生的事情。

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

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

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

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

    【讨论】:

    • 感谢您提供这些额外的说明。实际上,如果驱动程序未配置为加入全局事务,您将收到 XAException。但是您没有回答我对优化的主要关注。我发现了一篇有趣的帖子 (link),上面写着“XA 数据源可以支持两阶段提交协调,以及本地事务”+“[...]应用程序服务器执行“仅资源优化”并与 RMLT 中的资源管理器交互。”。是它的工作方式吗?
    • 还有这个答案http://stackoverflow.com/questions/5130934/jta-datasources-without-transactions#answer-5452025 很有趣:“完全有可能在支持 XA 的资源上启动非 XA 事务,并在本地提交它”。但是当访问相同的数据源并依赖 JTA 和 EJB CMT 时会发生这种情况吗?
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多