0

jboss AS 7にデプロイされたJavaアプリは、Springデータを使用してMSSQLサーバーデータベースにクエリを実行します。また、SpringJdbcTemplateを使用するzOSでDB2関数を呼び出す必要があります。SQLは次のとおりです。

public String getUniqueId()
{
    String sql = "SELECT " + schemaName + ".SGB_LON_ID_NEXT() FROM SYSIBM.SYSDUMMY1" ;
    return (jdbcTemplate.queryForLong(sql));
}

Eclipseの単体テストは正常に機能します。jbossサーバーにデプロイすると、最初の呼び出しが機能します。ただし、2番目以降のトランザクションでは、呼び出し自体は機能しますが、呼び出しごとにserver.logにいくつかの警告が表示されます。

JDBC呼び出しがJPAトランザクションの一部ではないという事実である可能性があるのではないかと思います。(jdbc呼び出しは単純であることに注意してください-DB2関数はフィールドの次のシリアル番号を返すだけです)

エラースタックからの警告メッセージは次のとおりです。

        21:50:33,955 WARN  [org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory] (http-/127.0.0.1:8080-14) 
        Destroying connection that is not valid, due to the following exception: com.ibm.db2.jcc.t4.b@1167bd5: com.ibm.db2.jcc.am.SqlSyntaxErrorException: 
        DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=<END-OF-STATEMENT>;MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MIN, DRIVER=3.63.123


        21:50:34,096 WARN  [org.jboss.jca.core.connectionmanager.listener.TxConnectionListener] (http-/127.0.0.1:8080-14) 
        IJ000305: Connection error occured:org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@f79f0f[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@136e43e connection handles=0 lastUse=1359255001136 trackByTx=false 
        pool=org.jboss.jca.core.connectionmanager.pool.strategy.PoolByCri@c2c2de pool internal context=SemaphoreArrayListManagedConnectionPool@8793c7[pool=DB2_zOS_DS] 
        xaResource=LocalXAResourceImpl@f70194[connectionListener=f79f0f connectionManager=112dadb warned=false currentXid=null] txSync=null]: 
        com.ibm.db2.jcc.am.SqlSyntaxErrorException: 
        DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=<END-OF-STATEMENT>;MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MIN, DRIVER=3.63.123


        21:50:34,196 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.PoolByCri] (http-/127.0.0.1:8080-14) 
        IJ000612: Destroying connection that could not be successfully matched: org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@f79f0f[state=DESTROYED managed connection=
        org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@136e43e connection handles=0 lastUse=1359255001136 trackByTx=false 
        pool=org.jboss.jca.core.connectionmanager.pool.strategy.PoolByCri@c2c2de pool internal context=SemaphoreArrayListManagedConnectionPool@8793c7[pool=DB2_zOS_DS] 
        xaResource=LocalXAResourceImpl@f70194[connectionListener=f79f0f connectionManager=112dadb warned=false currentXid=null] txSync=null]

修正方法に関する提案はありますか?JDBC呼び出しを現在のトランザクション(JPA)に追加する方法がわかりません。または、それは別のトランザクションである必要があります。前述のように、jdbc呼び出しは、シーケンス番号の次の値を返すdb2関数です。

4

1 に答える 1

0

問題は、JBOSS_HOME/standalone/configuration/standalone.xml のデータソース セットアップにあることが判明しました。

検証セクションで、これは正しくありませんでした。

<validation>
    <check-valid-connection-sql>select 1</check-valid-connection-sql>
<validation>

上記は正しくなく、DB2 は検証エラーを出していました。

代わりに次のように変更しました。

      <validation>
          <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker"/>
          <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2StaleConnectionChecker"/>
          <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter"/>
      </validation>

他の誰かが役に立つと思った場合に備えて、完全なデータソースのセットアップを次に示します。

    <datasource jndi-name="java:jboss/datasources/DB2_zOS_DS" pool-name="DB2_zOS_DS" enabled="true" use-java-context="true">
      <connection-url>jdbc:db2://MyHostName:MyPortNo/MyDBQA1:currentSchema=MySchemaQA1;</connection-url>
      <driver>db2zOS</driver>
      <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
      <pool>
          <min-pool-size>9</min-pool-size>
          <max-pool-size>50</max-pool-size>
          <prefill>true</prefill>
          <allow-multiple-users/>
      </pool>
      <security>
          <user-name>MY-APP-ID</user-name>
          <password>My-APP-ID-PASSWORD</password>
      </security>
      <validation>
          <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker"/>
          <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2StaleConnectionChecker"/>
          <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter"/>
      </validation>
      <timeout>
          <set-tx-query-timeout>true</set-tx-query-timeout>
          <blocking-timeout-millis>500</blocking-timeout-millis>
          <idle-timeout-minutes>15</idle-timeout-minutes>
      </timeout>
      <statement>
          <track-statements>false</track-statements>
          <prepared-statement-cache-size>32</prepared-statement-cache-size>
          <share-prepared-statements>true</share-prepared-statements>
      </statement>
    </datasource>
    <drivers>
      <driver name="db2zOS" module="com.ibm.db2">
          <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
      </driver>
    </drivers>
于 2013-01-28T21:11:43.180 に答える