предупреждающее сообщение в консоли при вызове функции DB2 в zOS с использованием jdbcTemplate

Мое Java-приложение, развернутое в jboss AS 7, запрашивает базу данных сервера MS SQL, используя данные Spring. Мне также нужно вызвать функцию DB2 в zOS, для которой я использую Spring JdbcTemplate. SQL это:

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

Модульные тесты в Eclipse работают нормально. Когда я развертываю на сервере jboss, работает первый вызов. Однако, начиная со второй транзакции, сам вызов работает, но в 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, которая возвращает следующее значение для порядкового номера.


person SGB    schedule 27.01.2013    source источник


Ответы (1)


Проблема оказалась в моей настройке источника данных в 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>
person SGB    schedule 28.01.2013