4

Jboss 6 で XA データソースを使用しており、接続の 1 つが切断されたときに and を使用<check-valid-connection-sql><background-validation-millis>て自動再接続しています。これは機能しますが、問題は、「再接続」の後、データベース操作が機能しているにもかかわらず、2分ごとにこの奇妙な例外が発生することです。

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]

それはドライバーでしょうか?(マイクロソフトのタイプ 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」クエリが実行されていませんか? ただし、クエリが実行されていることがわかります。

どんな助けでも大歓迎です!

4

1 に答える 1

1

正しく理解するために - JBoss AS 6 または JBoss EAP 6 を実行していますか? しかし、現在 jboss.org でダウンロードできる JBoss EAP 6 について話されています。

データベースのシャットダウン後の回復プロセスの再接続で同様の問題が発生しましたが、それが問題なのか、構成が欠落しているのかはわかりません。それはjdbcドライバーの問題ではないと思います。しかし、私は間違っている可能性があります。少し時間があれば、これを調査したいと思います。場合によってはお知らせします。

それにもかかわらず、私の回避策は、特定のデータソースの接続プールをフラッシュすることです。jboss cli のコマンドは次のようになります: /subsystem=datasources/xa-data-source=[datasource-name]:flush-all-connection-in-pool()

背後にあるものは何ですか?トランザクション マネージャー (Narayana) は、2 分ごとに回復のプロセスを開始します。リカバリは、アプリ サーバーのトランザクション マネージャ側とデータベース側でトランザクション ログをチェックします。修正が必要なインダウト トランザクションを探します。インダウト トランザクションの存在をチェックできるようにするには、リカバリ プロセスでデータベースに接続する必要があります。しかし、データベースがシャットダウンされると、接続プールは*おそらく*古い接続のままになります。この回避策では、強制的にプールがフラッシュされ、更新された接続で再び満たされます。

于 2014-06-11T10:26:29.223 に答える