【问题标题】:Jboss - Strange exception after auto-reconnecting to XA datasourceJboss - 自动重新连接到 XA 数据源后出现奇怪的异常
【发布时间】:2011-10-13 10:14:33
【问题描述】:

我在 Jboss 6 上使用 XA 数据源,使用 <check-valid-connection-sql><background-validation-millis> 在其中一个连接失效时自动重新连接。这可行,但问题是在“重新连接”之后,每两分钟左右我就会收到这个奇怪的异常,即使我的数据库操作正在运行。

2011-10-13 12:05:22,516 WARN  [com.arjuna.ats.jta] (Periodic Recovery) ARJUNA-16027 Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_RMERR: javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
    at com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:642) [:]
    at com.microsoft.sqlserver.jdbc.SQLServerXAResource.recover(SQLServerXAResource.java:723) [:]
    at org.jboss.resource.adapter.jdbc.xa.XAManagedConnection.recover(XAManagedConnection.java:294) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecovery(XARecoveryModule.java:468) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.resourceInitiatedRecoveryForRecoveryHelpers(XARecoveryModule.java:436) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkSecondPass(XARecoveryModule.java:155) [:6.0.0.Final]
    at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:789) [:6.0.0.Final]
    at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:371) [:6.0.0.Final]

2011-10-13 12:05:22,516 WARN  [com.arjuna.ats.jta] (Periodic Recovery) ARJUNA-16027 Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_RMERR: javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
    at com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:642) [:]
    at com.microsoft.sqlserver.jdbc.SQLServerXAResource.recover(SQLServerXAResource.java:723) [:]
    at org.jboss.resource.adapter.jdbc.xa.XAManagedConnection.recover(XAManagedConnection.java:294) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecovery(XARecoveryModule.java:468) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.resourceInitiatedRecoveryForRecoveryHelpers(XARecoveryModule.java:436) [:6.0.0.Final]
    at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkSecondPass(XARecoveryModule.java:155) [:6.0.0.Final]
    at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:789) [:6.0.0.Final]
    at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:371) [:6.0.0.Final]

会不会是司机? (我用的是微软的 type 4)

这是我的数据源配置:

<xa-datasource>
    <jndi-name>jdbc/MyDataSourceDS</jndi-name>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
    <xa-datasource-property name="ServerName">hostname</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">database</xa-datasource-property>
    <xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>
    <xa-datasource-property name="User">user</xa-datasource-property>
    <xa-datasource-property name="Password">password</xa-datasource-property>

    <!--pooling parameters-->
    <min-pool-size>5</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <prefill>true</prefill>
    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <idle-timeout-minutes>15</idle-timeout-minutes>
    <new-connection-sql>select 1</new-connection-sql>
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
    <background-validation>true</background-validation>
    <background-validation-millis>10000</background-validation-millis> 
      <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
      <metadata>
         <type-mapping>MS SQLSERVER2000</type-mapping>
      </metadata>
  </xa-datasource>

另外,我没有在日志中的每个查询之前看到“SELECT 1”查询?我看到我的查询正在运行。

任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server jpa jboss jta xa


    【解决方案1】:

    正确理解——您运行的是 JBoss AS 6 还是 JBoss EAP 6? 但我说的是 JBoss EAP 6,目前可以在 jboss.org 下载。

    我在数据库关闭后重新连接恢复过程时遇到了类似的问题,我不确定这是问题还是缺少配置。我认为这不是 jdbc 驱动程序的问题。但我可能是错的。如果我有一点时间,我会好奇地对此进行调查。以防万一我会让你知道。

    尽管如此 - 我的解决方法是刷新特定数据源的连接池。 jboss cli 中的命令如下: /subsystem=datasources/xa-data-source=[datasource-name]:flush-all-connection-in-pool()

    背后是什么? 事务管理器 (Narayana) 每 2 分钟启动一次恢复过程。恢复检查应用服务器事务管理器端和数据库端的事务日志。它寻找需要修复的不确定事务。 恢复过程需要连接到数据库,以便能够检查是否存在不确定事务。但是当数据库关闭时,连接池*可能*会保留旧连接。 解决方法会强制刷新池并再次使用更新的连接填充。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2014-06-10
      • 2013-08-13
      • 2014-08-23
      相关资源
      最近更新 更多