0

我的 java 应用程序部署在 jboss AS 7 中,使用 spring 数据查询 MS SQL 服务器数据库。我还需要在使用 Spring JdbcTemplate 的 zOS 上调用 DB2 函数。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 函数,它返回序列号的下一个值。

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 回答