在 TomEE 的 Spring JDBCTemplate 上偶尔出现 "Failed to validate a newly established connection" SQL 异常
Getting occasional "Failed to validate a newly established connection" SQL Exception on a Spring JDBCTemplate in TomEE
我在 TomEE (7.0.1) 中有一个小型 Spring (4.3.5) 应用 运行ning,与 Oracle (11) 数据库对话。
我有一个 DAO class 可以 运行 两个不同的查询。
我有两个查询处理器任务 运行在调度程序上执行这些查询,每两分钟一个,每三分钟一个。当我第一次看到我要描述的问题时,我有一个计划任务 运行 宁两个查询。
这两个查询很相似,只是在同一个 table 上返回不同的列和聚合。这两个查询在代码中组合在一起,但它们并不是真正的动态查询。组件是相对静态的。通过在调试器中 运行ning 并将生成的查询粘贴到我的 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>
我可以在这里做什么?
你确定
validationQuery = "select 1 from dual"
你是什么意思?是不是
validationQuery = select 1 from dual
我在 TomEE (7.0.1) 中有一个小型 Spring (4.3.5) 应用 运行ning,与 Oracle (11) 数据库对话。
我有一个 DAO class 可以 运行 两个不同的查询。
我有两个查询处理器任务 运行在调度程序上执行这些查询,每两分钟一个,每三分钟一个。当我第一次看到我要描述的问题时,我有一个计划任务 运行 宁两个查询。
这两个查询很相似,只是在同一个 table 上返回不同的列和聚合。这两个查询在代码中组合在一起,但它们并不是真正的动态查询。组件是相对静态的。通过在调试器中 运行ning 并将生成的查询粘贴到我的 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>
我可以在这里做什么?
你确定
validationQuery = "select 1 from dual"
你是什么意思?是不是
validationQuery = select 1 from dual