4

我正在运行一个 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:]

到目前为止,我还无法破译我在这里应该做什么,我有点担心将这种状态的应用程序投入生产。

任何人都可以阐明为什么会发生这种情况,如何解决和避免它?

编辑:

在 Windows 日志中,我找不到任何看起来像 DTC 错误的内容:

MSDTC 使用以下设置开始:

安全配置(OFF = 0 和 ON = 1):允许远程管理员 = 0,网络客户端 = 0,事务管理器通信:允许入站事务 = 0,允许出站事务 = 0,事务 Internet 协议 (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 毫秒。)这只是一条信息性消息。无需用户操作。

4

3 回答 3

3

有同样的问题。

我是怎么解决的?使用分布式事务(在我的例子中插入一些数据)。

我的猜测,我之所以说是猜测,是因为 sqljdbc4.jar 源代码尚未发布,无法判断问题的真正原因。好吧,我的猜测是每次您的 jboss 服务器启动时,您的分布式事务框架都会检查要恢复的事务。这些都保存在第一次为空的表中,因此这会引发警告(com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:550) ),因为xp_sqljdbc_xa_recover存储过程再次找不到任何东西(我'我再次猜测)。

所以基本上,使用分布式事务将一些东西插入数据库并再次运行 jboss/tomcat 服务器以消除警告。

于 2014-03-05T18:03:23.290 回答
1

我有同样的问题,只要它指向同一个 DBMS,无论我运行哪个实例,错误都会一直显示。当我运行存储过程“xp_sqljdbc_xa_recover”时,问题自行解决。正如Painy James所指出的

于 2015-07-24T04:08:53.170 回答
0

您要么没有在 DTC 中启用 XA,要么忘记授予 SqlJDBCXAUser 角色。

于 2013-01-24T16:17:57.293 回答