【问题标题】:JBoss spamming XA Recovery warningsJBoss 垃圾邮件 XA 恢复警告
【发布时间】:2013-01-23 09:35:10
【问题描述】:

我正在运行一个 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) 的不确定分布式事务的恢复。这只是一条信息性消息。无需用户操作。


在 1 秒内完成数据库 MyDatabase(数据库 ID 20)的恢复(分析 589 毫秒,重做 0 毫秒,撤消 398 毫秒。)这只是一条信息性消息。无需用户操作。

【问题讨论】:

  • 我面临同样的问题。你找到解决这个问题的方法了吗?
  • @BhushanPatil,我猜微软最近修复了这个问题。我认为您可以查看 mssql-jdbc github 项目的 dev 分支。参考:github.com/Microsoft/mssql-jdbc/pull/257

标签: java sql-server jpa jboss7.x xa


【解决方案1】:

遇到同样的问题。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 两者都已正确设置,按照 Microsoft 的说明 - 通过 SQL 分析器和 DTC 统计数据显示 XA 事务正在正确启动、提交和回滚。
      猜你喜欢
      • 2017-06-15
      • 2019-02-23
      • 1970-01-01
      • 2011-07-12
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多