偶尔会出现“无法验证新建立的连接”在TomEE中的Spring JDBCTemplate上的SQL异常

问题描述 投票:0回答:1

我有一个在TomEE(7.0.1)中运行的小型Spring(4.3.5)应用程序,与Oracle(11)数据库交谈。

我有一个可以运行两个不同查询的DAO类。

我有两个查询处理器任务在调度程序上运行这些查询,每两分钟一个,每三分钟一个。当我第一次看到我要描述的问题时,我有一个运行两个查询的计划任务。

两个查询都相似,只是在同一个表上返回不同的列和聚合。这两个查询是在代码中汇编的,但它们并不是真正的动态。组件相对静态。我已经通过在调试器中运行并将生成的查询粘贴到我的SQL浏览器中来验证两个查询都没问题,并且它们都可以正常工作。

当我启动应用程序时,我会从两个查询中获得几次结果。然后,我开始在日志中看到以下内容:

Jan 19, 2017 9:21:05 AM org.apache.tomcat.jdbc.pool.PooledConnection validate
WARNING: SQL Validation error
java.lang.NullPointerException
    at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:973)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1041)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1909)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1871)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:318)
    at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:509)
    at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:443)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.testAllIdle(ConnectionPool.java:1049)
    at org.apache.tomcat.jdbc.pool.ConnectionPool$PoolCleaner.run(ConnectionPool.java:1371)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

Jan 19, 2017 9:21:05 AM org.apache.tomcat.jdbc.pool.PooledConnection validate
WARNING: SQL Validation error
java.sql.SQLException: Invalid SQL type: sqlKind = UNINITIALIZED
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:63)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1033)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1909)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1871)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:318)
    at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:509)
    at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:443)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.testAllIdle(ConnectionPool.java:1049)
    at org.apache.tomcat.jdbc.pool.ConnectionPool$PoolCleaner.run(ConnectionPool.java:1371)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

这显然是在池验证中,而不是在运行我的查询时。

tomee.xml中的我的数据源如下所示:

      <Resource id="tst36" type="DataSource">
        testOnBorrow = true
        testOnReturn = true
        testWhileIdle = true
        logValidationErrors = true
        validationQuery = "select 1 from dual"
        JdbcDriver = oracle.jdbc.OracleDriver
        MaxActive = 10
        MinIdle = 2
        MaxIdle = 2 
        MaxWait = 10000
        JdbcUrl = jdbc:...
        UserName = ...
        Password = ...
  </Resource>

我能在这做什么?

java spring tomee tomee-7
1个回答
2
投票

你确定吗

validationQuery = "select 1 from dual"

你是什​​么意思?不是吗

validationQuery = select 1 from dual
© www.soinside.com 2019 - 2024. All rights reserved.