我正在运行一个 JPA/Spring 应用程序,该应用程序连接到 Microsoft SQL Server 上多个启用 XA 的数据源。一切工作正常,全局事务正确启动并根据需要回滚......
但是,JBoss 有时会变得疯狂,每隔几秒就开始发送以下警告:
10:25:22,524 WARN [com.arjuna.ats.jta] (Periodic Recovery) ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_RMERR: javax.transaction.xa.XAException: The function RECOVER: failed. The status is: -3. Error: "*** SQLJDBC_XA DTC_ERROR Context: xa_recover, state=1, StatusCode:-3 (0xFFFFFFFD) ***"
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:550)
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.recover(SQLServerXAResource.java:728)
at org.jboss.jca.adapters.jdbc.xa.XAManagedConnection.recover(XAManagedConnection.java:358)
at org.jboss.jca.core.tx.jbossts.XAResourceWrapperImpl.recover(XAResourceWrapperImpl.java:162)
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecovery(XARecoveryModule.java:503) [jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.resourceInitiatedRecoveryForRecoveryHelpers(XARecoveryModule.java:471) [jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.bottomUpRecovery(XARecoveryModule.java:385) [jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkSecondPass(XARecoveryModule.java:166) [jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:789) [jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:371) [jbossjts-4.16.2.Final.jar:]
到目前为止,我还无法破译我在这里应该做什么,并且我有点担心将处于这种状态的应用程序投入生产。
谁能解释一下为什么会发生这种情况,如何解决和避免这种情况?
EDIT:
在 Windows 日志中,我找不到任何看起来像 DTC 错误的内容:
MSDTC 使用以下设置启动:
安全配置(OFF = 0 且 ON = 1):允许远程
管理员 = 0,网络客户端 = 0,事务管理器
通信:允许入站交易 = 0,允许出站
交易 = 0,交易互联网协议 (TIP) = 0,启用
XA 事务 = 1,启用 SNA LU 6.2 事务 = 1,MSDTC
通讯安全=需要相互认证,账户=
NT AUTHORITY\NetworkService,检测到防火墙排除 = 0
已安装事务桥 = 0 过滤重复事件 = 1
尝试初始化 Microsoft 分布式事务协调器 (MS DTC)。这只是一条信息性消息。无需用户操作。
涉及 Microsoft 分布式事务协调器 (MS DTC) 的任何可疑分布式事务的恢复已完成。这只是一条信息性消息。无需用户操作。
数据库 MyDatabase(数据库 ID 20)的恢复在 1 秒内完成(分析 589 毫秒,重做 0 毫秒,撤消 398 毫秒。)这只是一条信息性消息。无需用户操作。
有同样的问题。
我是怎么解决的?使用分布式事务(在我的例子中插入一些数据)。
我的猜测,我说猜测是因为 sqljdbc4.jar 源代码尚未发布,无法判断到底是什么问题。好吧,我的猜测是,每次你的 jboss 服务器启动时,你的分布式事务框架都会检查待恢复的交易。这些保存在第一次为空的表中,因此这会引发警告 (com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:550) ),因为再次xp_sqljdbc_xa_recover存储过程找不到任何东西(我再次猜测)。
所以基本上,使用分布式事务将一些内容插入到数据库中,然后再次运行 jboss/tomcat 服务器以消除警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)