我是相当新的XA和非XA的世界。我的要求是从队列中读取消息,直到出现NO消息。对于队列中的每条消息,转到数据库并执行一些事务,如选择,插入,更新。XA或非XA的JMS和DB操作
这是可能实现这一目标使用非XA数据源?我目前正在使用XA数据源,但了解到它的成本很高,性能受到影响。
感谢任何帮助!由于
我是相当新的XA和非XA的世界。我的要求是从队列中读取消息,直到出现NO消息。对于队列中的每条消息,转到数据库并执行一些事务,如选择,插入,更新。XA或非XA的JMS和DB操作
这是可能实现这一目标使用非XA数据源?我目前正在使用XA数据源,但了解到它的成本很高,性能受到影响。
感谢任何帮助!由于
如果您需要在您的交易,包括与JMS连接双方交互(即发送或接收信息),并与数据库连接,通过使用数据库连接那么你一定需要一个XA-数据源因为您的交易是two-phase commit (2PC) transaction。
在两阶段提交事务你要么更改提交到所有的资源(在你的情况JMS和DB资源),或者,如果出现错误与其中一方回滚所有更改。
要做到这一点,您需要连接到已启用XA的数据源。 此外,在Java EE容器中,JMS连接应已启用XA-。
XA保证一个消息匹配1和仅1 DB事务。 让我们觉得发生没有XA(只是众多可能的情况之一):
对于我们的幸运,XA存在! :-) 从表演角度来看,付费是有成本的,但总是质量(服务)有成本!
考虑1.5 phase commit。基本上是:
可能的错误情况:
不是1或3会使您的系统处于不一致的状态。如果是1,则只需重新发送消息。
要处理方案2,您需要向系统引入重复检查。所以基本上您的交易管理看起来像类似于这样:
//pseudo code
if (isDublicate(message))
commitJMSTransaction();
else
doYourBusinessLogic();
doYourDBOperation();
commitDBTransaction();
commitJMSTransaction();
如果JMS交易失败的消息代理将重新尝试发送邮件(或者你需要重新发送手动取决于你的经纪人设置),但你复制检查将检测到它并将其从队列中删除。
感谢您的链接! – rbp
为了给你一个XA和NON-XA转换的想法,我简要解释一下, XA事务是一个“全局事务”。 非XA交易是“本地交易”。
XA事务涉及协调事务管理器,一个或多个数据库(或其他资源,如JMS)都参与单个全局事务。如果它连接到多个数据库,那么它是XA。
非XA事务没有事务协调器,并且单个资源正在完成其所有事务工作本身。这将只有一个数据库作为资源。
你应该解释一下如何管理队列,使用什么产品。一些数据库供应商还提供排队解决方案,这将使您的生活更轻松。 – steve