最近,DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常。

版本说明

  • commons-dbcp-1.4.jar
  • commons-pool-1.5.4.jar

关键字

异常关键字为:

  • 无法从套接字读取更多的数据
  • OALL8 处于不一致状态
  • Io 异常: 断开的管道

参考的链接

java.sql.SQLException: OALL8 is in an inconsistent state

OALL8 is in an inconsistent state

dbcp基本配置和重连配置

初步解决方案

查看了上述的资料,尝试了将10.2.0.3的驱动降为9.2.0.0的,结果无效。由此看来,此问题的原因有很多种,看来我并不是帖子上遇到的那些原因。

后来,在数据源的配置上加上连接池的心跳检测就ok了(见如下代码除驱动类、账号、密码外的配置)。

配置项意义见:BasicDataSource Configuration Parameters

<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- 打开用异步线程进行检查连接 -->
<property name="testWhileIdle"><value>true</value></property>
<property name="testOnBorrow"><value>false</value></property>
<property name="testOnReturn"><value>false</value></property>
<property name="validationQuery"><value>select 1 from dual</value></property>
<property name="validationQueryTimeout"><value>1</value></property>
<property name="timeBetweenEvictionRunsMillis"><value>30000</value></property>
<property name="numTestsPerEvictionRun"><value>20</value></property> <!-- 每次检查连接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的连接 -->
</bean>

问题在于连接池中的连接经过数据库重启后实际上已失效(或过时),而连接池并不知道,继续正常使用,导致报错。如今加上检查连接测试即正常。

为什么加了检查连接就可以了呢

因在公司时间较紧迫,匆匆解决后,有些问题仍不清晰。

回家后,对问题做了重现,现简要记录一下。

之前的配置如下,只有数据库的连接,连validationQuery都没有配,所以dbcp并不作任何连接的检查:

<!-- DBCP -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@10.0.0.109:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="xxxxx" />
</bean>

DBCP连接Oracle,按照如下步骤操作:

  1. 启动web应用程序
  2. 尝试查询,成功
  3. 关闭数据库,然后启动数据库,中间不作页面查询
  4. 测试查询,报如下异常
org.springframework.dao.RecoverableDataAccessException: <|### Error querying database.
Cause: java.sql.SQLRecoverableException: 无法从套接字读取更多的数据<|### The error may exist in file [D:\workspace\jee_workspace\mybatis3spring3Intg\target\classes\com\nicchagil\mybatis3spring3intg\mapper\sqlxml\user_mapper.xml]
<|### The error may involve defaultParameterMap<|### The error occurred while setting parameters
<|### SQL: select u.id, u.username, u.password, u.childhoodname, u.age from t_user u where 1 = 1
<|### Cause: java.sql.SQLRecoverableException: 无法从套接字读取更多的数据|; SQL [];
无法从套接字读取更多的数据; nested exception is java.sql.SQLRecoverableException: 无法从套接字读取更多的数据

将配置加上validationQuery后即无问题,因连接池中借出连接时会用此配置项的SQL检查连接是否有效。(默认testOnBorrow为true)

Oracle的配置为如下:

<!-- DBCP -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@10.0.0.109:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="xxxxx" />
<property name="validationQuery"><value>select 1 from dual</value></property>
</bean>

没找到关于BDCP1.4的配置项说明文档(知道在哪的童靴请告知),翻了源码确定这些信息(初步确认,并不完全确认,请知悉),附:

BasicDataSource.java

/**
* The indication of whether objects will be validated before being
* borrowed from the pool. If the object fails to validate, it will be
* dropped from the pool, and we will attempt to borrow another.
*/
protected boolean testOnBorrow = true;

BasicDataSource.java

// Can't test without a validationQuery
if (validationQuery == null) {
setTestOnBorrow(false);
setTestOnReturn(false);
setTestWhileIdle(false);
}

最新文章

  1. easyUI 后台经典框架DEMO下载
  2. wifi 驱动移植范例
  3. 深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)
  4. wget下载FTP的文件
  5. .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)
  6. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
  7. MyEclipse中提示SpringMVC的XML配置文件出错解决方法
  8. --@angularJS--angular与BootStrap3的应用
  9. 【openstack N版】——镜像服务glance
  10. php开启fileinfo扩展
  11. 对一个元素 同时添加单击onclick 和 双击ondblclick 触发冲突的解决
  12. bootstrap的模拟单选按钮
  13. MVC和WEBAPI(一)
  14. Grape教程-params
  15. 【Go命令教程】8. go test
  16. python unicode to str and str to unicode
  17. NHibernate的调试技巧和Log4Net配置
  18. __attribute__((weak, alias())))
  19. TStringGrid的Rows索引值 和 Cells的 索引值, Row的赋值
  20. Oracle 12c RAC 日志体系结构的变化

热门文章

  1. CCF真题之图像旋转
  2. paper 81:HDR成像技术
  3. app_field.clear_dependent_fields
  4. PAT乙级 1026. 程序运行时间(15)
  5. 给Debian浏览器安装flash播放插件
  6. NOIP200503采药
  7. NOIP201402比例化简
  8. HGE游戏引擎之实战篇,渐变的游戏开场
  9. nginx 优化
  10. 161107、spring异步调用,完美解决!