druid 在打开PSCache时偶现Closed Statement错误

cxfofazt  于 3个月前  发布在  Druid
关注(0)|答案(7)|浏览(42)

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
请问这种现象是什么原因导致的 需要怎么解决

k97glaaz

k97glaaz1#

数据库修改过表结构

ne5o7dgx

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缓存。
希望我的补充能有所帮助。

lsmepo6l

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缓存。
希望我的补充能有所帮助。

能否描述一下,具体是哪两个参数?

kxkpmulp

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配置项,传上去之后估计不支持,乱了

cbwuti44

cbwuti445#

数据库修改过表结构

谢谢回复,这个现象是生产上发现的,数据库在这期间没有修改过表结构

okxuctiv

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

dphi5xsq

dphi5xsq7#

使用Mariadb时也遇到过这个问题,问题原因是使用了游标查询,每次执行完毕之后关闭游标的时候会顺带关闭Statement,但是因为开启了PSCache,导致下次相同的查询过来的时候会从Cache中拿到被关闭了的Statement,这就导致异常出来了,希望对你有帮助

相关问题