Mám v aplikácii TomEE (7.0.1) spustenú malú jarnú aplikáciu (4.3.5), ktorá hovorí s databázou Oracle (11) db.
Mám jednu triedu DAO, ktorá dokáže spracovať dva rôzne dotazy.
Mám na nich dve úlohy spojené s procesorom dotazovdotazy, v plánovači, každé každé dve minúty, jedno každé tri minúty. Keď som prvýkrát videl problém, ktorý budem opísať, mal som jednu naplánovanú úlohu, ktorá spúšťala obidva dotazy.
Obidva dotazy sú podobné, len sa vracajúrôzne stĺpce a agregáty v tej istej tabuľke. Tieto dva dotazy sú zostavené v kóde, ale nie sú skutočne dynamické. Komponenty sú relatívne statické. Overil som, že obidva dotazy sú v poriadku spustením debuggeru a vložením vygenerovaného dotazu do môjho prehľadávača SQL. Obe fungujú poriadku.
Keď spustím aplikáciu, niekoľkokrát získam výsledky z oboch dopytov. Potom som v denníku začal vidieť toto:
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)
Je to jednoznačne pri overovaní fondu, nie pri spúšťaní môjho dotazu.
Môj zdroj údajov v súbore tomee.xml vyzerá takto:
<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>
Čo tu môžem urobiť?
odpovede:
1 pre odpoveď č. 1si si istý
validationQuery = "select 1 from dual"
čo si myslel? Nie je to tak
validationQuery = select 1 from dual