druid版本为1.1.21 数据库为oracle
配置为:
<property name="maxActive" value="50"/>
<property name="initialSize" value="5"/>
<property name="minIdle" value="30"/>
<property name="maxWait" value="10000"/>
<property name="minEvictableIdleTimeMillis" value="90000"/>
<property name="testWhileIdle" value="true"/>
<property name="validationQuery" value="select 1 from dual"/>
<property name="keepAlive" value="true"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="10"/>
<property name="fastFail" value="true"/>
驱动版本为:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
<scope>runtime</scope>
</dependency>
报错信息1:
Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'XXXX' from result set. Cause: java.sql.SQLRecoverableException: Closed Statement
The error may exist in XXXX.xml
The error may involve XXXXMapper.XXXX
The error occurred while handling results
报错信息2:
Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'XXXX' from result set. Cause: java.sql.SQLException: Exhausted Resultset
The error may exist in XXXX.xml
The error may involve XXXXMapper.XXXX
The error occurred while handling results
报错信息3:
Error querying database. Cause: java.sql.SQLRecoverableException: internal error
The error may exist in XXXX.xml
The error may involve XXXXMapper.XXXX-Inline
请问这种现象是什么原因导致的 需要怎么解决
7条答案
按热度按时间k97glaaz1#
数据库修改过表结构
ne5o7dgx2#
我们目前也遇到了这个问题,500并发情况下,打开PSCache,就会报错:
14:15:29,069 ERROR - exitImplicitCacheToClose error
java.sql.SQLRecoverableException: Closed Statement
at oracle.jdbc.driver.OracleClosedStatement.exitImplicitCacheToClose(OracleClosedStatement.java:4687)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.exitImplicitCacheToClose(OraclePreparedStatementWrapper.java:1623)
at com.alibaba.druid.util.OracleUtils.exitImplicitCacheToClose(OracleUtils.java:87)
at com.alibaba.druid.pool.PreparedStatementPool.closeRemovedStatement(PreparedStatementPool.java:170)
at com.alibaba.druid.pool.PreparedStatementPool.clear(PreparedStatementPool.java:138)
at com.alibaba.druid.pool.DruidConnectionHolder.clearStatementCache(DruidConnectionHolder.java:255)
at com.alibaba.druid.pool.DruidPooledConnection.disable(DruidPooledConnection.java:223)
at com.alibaba.druid.pool.DruidDataSource.handleFatalError(DruidDataSource.java:1818)
at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1780)
at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:137)
at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:81)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:240)
网上也查了一下资料,刚开始怀疑是ojdbc驱动问题,我们用的Oracle18c,更换了匹配的ojdbc8之后,问题依然出现。
然后我又怀疑是druid版本问题,然后从1.1.22升级到1.2.6,问题依旧。
之后就考虑到是不是PS缓存问题,就把2个缓存参数注释掉,这时候500并发情况下,问题消失了。
10000
true
18800
true
stat
20
500
20
SELECT 1 FROM DUAL
true
60000
然后我又测试了druid1.1.22 以及ojdbc6,发现只要注释掉这两个参数,500并发都没有问题。
所以目前来看大概率还是这两个参数导致了高并发下的这种问题。
我们的处理方式暂时是注释掉了PS缓存。
希望我的补充能有所帮助。
lsmepo6l3#
我们目前也遇到了这个问题,500并发情况下,打开PSCache,就会报错:
14:15:29,069 ERROR - exitImplicitCacheToClose error
java.sql.SQLRecoverableException: Closed Statement
at oracle.jdbc.driver.OracleClosedStatement.exitImplicitCacheToClose(OracleClosedStatement.java:4687)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.exitImplicitCacheToClose(OraclePreparedStatementWrapper.java:1623)
at com.alibaba.druid.util.OracleUtils.exitImplicitCacheToClose(OracleUtils.java:87)
at com.alibaba.druid.pool.PreparedStatementPool.closeRemovedStatement(PreparedStatementPool.java:170)
at com.alibaba.druid.pool.PreparedStatementPool.clear(PreparedStatementPool.java:138)
at com.alibaba.druid.pool.DruidConnectionHolder.clearStatementCache(DruidConnectionHolder.java:255)
at com.alibaba.druid.pool.DruidPooledConnection.disable(DruidPooledConnection.java:223)
at com.alibaba.druid.pool.DruidDataSource.handleFatalError(DruidDataSource.java:1818)
at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1780)
at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:137)
at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:81)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:240)
网上也查了一下资料,刚开始怀疑是ojdbc驱动问题,我们用的Oracle18c,更换了匹配的ojdbc8之后,问题依然出现。
然后我又怀疑是druid版本问题,然后从1.1.22升级到1.2.6,问题依旧。
之后就考虑到是不是PS缓存问题,就把2个缓存参数注释掉,这时候500并发情况下,问题消失了。
10000
true
18800
true
stat
20
500
20
SELECT 1 FROM DUAL
true
60000
然后我又测试了druid1.1.22 以及ojdbc6,发现只要注释掉这两个参数,500并发都没有问题。
所以目前来看大概率还是这两个参数导致了高并发下的这种问题。
我们的处理方式暂时是注释掉了PS缓存。
希望我的补充能有所帮助。
能否描述一下,具体是哪两个参数?
kxkpmulp4#
我们目前也遇到了这个问题,500并发情况下,打开PSCache,就会报错:
14:15:29,069 ERROR - exitImplicitCacheToClose error
java.sql.SQLRecoverableException: Closed Statement
at oracle.jdbc.driver.OracleClosedStatement.exitImplicitCacheToClose(OracleClosedStatement.java:4687)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.exitImplicitCacheToClose(OraclePreparedStatementWrapper.java:1623)
at com.alibaba.druid.util.OracleUtils.exitImplicitCacheToClose(OracleUtils.java:87)
at com.alibaba.druid.pool.PreparedStatementPool.closeRemovedStatement(PreparedStatementPool.java:170)
at com.alibaba.druid.pool.PreparedStatementPool.clear(PreparedStatementPool.java:138)
at com.alibaba.druid.pool.DruidConnectionHolder.clearStatementCache(DruidConnectionHolder.java:255)
at com.alibaba.druid.pool.DruidPooledConnection.disable(DruidPooledConnection.java:223)
at com.alibaba.druid.pool.DruidDataSource.handleFatalError(DruidDataSource.java:1818)
at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1780)
at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:137)
at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:81)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:240)
网上也查了一下资料,刚开始怀疑是ojdbc驱动问题,我们用的Oracle18c,更换了匹配的ojdbc8之后,问题依然出现。
然后我又怀疑是druid版本问题,然后从1.1.22升级到1.2.6,问题依旧。
之后就考虑到是不是PS缓存问题,就把2个缓存参数注释掉,这时候500并发情况下,问题消失了。
10000
true
18800
true
stat
20
500
20
SELECT 1 FROM DUAL
true
60000
然后我又测试了druid1.1.22 以及ojdbc6,发现只要注释掉这两个参数,500并发都没有问题。
所以目前来看大概率还是这两个参数导致了高并发下的这种问题。
我们的处理方式暂时是注释掉了PS缓存。
希望我的补充能有所帮助。
能否描述一下,具体是哪两个参数?
这两个参数:poolPreparedStatements & maxPoolPreparedStatementPerConnectionSize
刚才我copy的xml配置项,传上去之后估计不支持,乱了
cbwuti445#
数据库修改过表结构
谢谢回复,这个现象是生产上发现的,数据库在这期间没有修改过表结构
okxuctiv6#
我们目前也遇到了这个问题,500并发情况下,打开PSCache,就会报错:
14:15:29,069 ERROR - exitImplicitCacheToClose error java.sql.SQLRecoverableException: Closed Statement at oracle.jdbc.driver.OracleClosedStatement.exitImplicitCacheToClose(OracleClosedStatement.java:4687) at oracle.jdbc.driver.OraclePreparedStatementWrapper.exitImplicitCacheToClose(OraclePreparedStatementWrapper.java:1623) at com.alibaba.druid.util.OracleUtils.exitImplicitCacheToClose(OracleUtils.java:87) at com.alibaba.druid.pool.PreparedStatementPool.closeRemovedStatement(PreparedStatementPool.java:170) at com.alibaba.druid.pool.PreparedStatementPool.clear(PreparedStatementPool.java:138) at com.alibaba.druid.pool.DruidConnectionHolder.clearStatementCache(DruidConnectionHolder.java:255) at com.alibaba.druid.pool.DruidPooledConnection.disable(DruidPooledConnection.java:223) at com.alibaba.druid.pool.DruidDataSource.handleFatalError(DruidDataSource.java:1818) at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1780) at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:137) at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:81) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:240)
网上也查了一下资料,刚开始怀疑是ojdbc驱动问题,我们用的Oracle18c,更换了匹配的ojdbc8之后,问题依然出现。 然后我又怀疑是druid版本问题,然后从1.1.22升级到1.2.6,问题依旧。 之后就考虑到是不是PS缓存问题,就把2个缓存参数注释掉,这时候500并发情况下,问题消失了。 10000 true 18800 true stat 20 500 20 SELECT 1 FROM DUAL true 60000
然后我又测试了druid1.1.22 以及ojdbc6,发现只要注释掉这两个参数,500并发都没有问题。 所以目前来看大概率还是这两个参数导致了高并发下的这种问题。 我们的处理方式暂时是注释掉了PS缓存。 希望我的补充能有所帮助。
谢谢回复,后面我们也把升级的配置回退了,就没有问题了, 不过目前还遇到比较诡异的问题,不知道您这边遇到过吗 #4552
dphi5xsq7#
使用Mariadb时也遇到过这个问题,问题原因是使用了游标查询,每次执行完毕之后关闭游标的时候会顺带关闭Statement,但是因为开启了PSCache,导致下次相同的查询过来的时候会从Cache中拿到被关闭了的Statement,这就导致异常出来了,希望对你有帮助