用于JMS和DB操作的XA或非XA

时间:2014-01-17 09:45:35

标签: jms websphere rad xa

我是XA和非XA世界的新手。我的要求是从队列中读取消息,直到没有消息。对于队列中的每条消息,转到DB并执行一些事务,如select,insert,update。

使用非XA数据源是否可以实现此目的?我目前正在使用XA数据源,但了解到它的成本和性能都很高。

感谢任何帮助!感谢

4 个答案:

答案 0 :(得分:3)

如果您需要在事务中包含与 JMS连接的交互(即发送或接收消息)并使用数据库连接连接数据库那么你肯定需要一个XA数据源,因为你的交易是 two-phase commit (2PC) transaction

在两阶段提交事务中,您可以将更改提交到所有资源(在您的情况下为JMS和DB资源),或者如果其中任何一个出现问题,则回滚所有更改。

要执行此操作,您需要连接到支持XA的数据源。 此外,在Java EE容器中, JMS连接应该已经启用了XA

答案 1 :(得分:2)

考虑1.5 phase commit。基本上是:

  • 步骤1:您提交数据库事务
  • 第2步:提交JMS事务。

可能的错误情况:

  1. 数据库事务失败。
  2. 数据库事务成功的JMS事务失败。
  3. 全部成功。
  4. 不是1,也不是3使您的系统处于不一致状态。如果是1,您只需要重新发送消息。

    要处理方案2.您需要向系统引入重复检查。所以基本上你的交易管理看起来就像这样:

    //pseudo code
    if (isDublicate(message))
       commitJMSTransaction();
    else
       doYourBusinessLogic();
       doYourDBOperation();
       commitDBTransaction();
       commitJMSTransaction();
    

    如果JMS事务失败,您的消息代理将重试发送消息(或者您需要根据代理设置手动重新发送消息),但是重复检查将检测它并将其从队列中删除。

答案 2 :(得分:2)

为了让您了解XA和NON-XA转换,我会简要解释一下, XA交易是一个全球交易"。 非XA交易是"本地交易"。

XA事务涉及协调事务管理器,其中一个或多个数据库(或其他资源,如JMS)都涉及单个全局事务。如果它连接到多个数据库,那么它就是XA。

非XA事务没有事务协调器,并且单个资源本身正在执行其所有事务。这将只有一个数据库作为资源。

答案 3 :(得分:0)

XA保证一条消息匹配1并且只有1条DB事务。 让我们想想没有XA会发生什么(只是众多可能情况中的一种):

  1. MDB选择了一​​条消息
  2. MDB执行数据库工作(假设一切顺利......没有例外)
  3. 由于某种原因,应用程序服务器jdk崩溃,或者MDB线程仍在运行时出现网络故障
  4. 为简单起见,我们考虑服务器重启:由于MDB没有提交事务,因此消息仍在队列中。
  5. 另一个MDB获取消息并重复数据库事务。
  6. 幸运的是,XA存在! :-) 从性能的角度来看,付费是有代价的,但质量(服务)总是有成本的!