最近,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);
}

DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常的更多相关文章

  1. cmd连接Oracle数据库成功后输入sql语句返回 2

    解决办法 : sql语句后一定要跟分号  .

  2. Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法

    asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...

  3. Windows server2008 搭建ASP接口访问连接oracle数据库全过程记录--备用

    真的是太不容易了,以前的时候在window server 2003上面搭建了一套asp+oracle的接口系统,就费了好大的劲儿,其实那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨天到今 ...

  4. JDBC连接Oracle数据库的问题

    场景:最近做一个java web项目,使用jdbc连接Oracle数据库,遇到了两个问题. 问题1:jdbc连接不上Ubuntu Oracle服务器? 后来发现这个问题的原因是由于连接字符串写错了,修 ...

  5. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  6. navicat连接Oracle数据库

    记录一下navicat连接Oracle数据库过程: 一.根据自己版本去Oracle官网下载instantclient 地址:https://www.oracle.com/technetwork/top ...

  7. PLSQL连接Oracle数据库问题及详解

    一.Oracle数据库安装步骤参考:https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html 二.Oracle客户端安装:http ...

  8. linux系统下php通过php_oci8扩展连接oracle数据库 Nginx

    相关版本信息: PHP Version 5.6.30 nginx version: nginx/1.10.3 Linux version 2.6.32-358.el6.x86_64 (mockbuil ...

  9. Asp.Net 远程连接Oracle数据库

    Asp.Net 远程连接Oracle数据库 首先从微软停止.Net FrameWork支持Oracle数据库的研发,转为第三方提供说起,微软是很有实力的公司,他在桌面领域令其他对手望其项背,产品战线也 ...

随机推荐

  1. android05

    #ANR(application not response) 应用程序无响应原因: >主线程里面执行了耗时的操作.就会导致应用程序无响应. <自己动手写操作系统> 带界面的应用程序都 ...

  2. 《zw版·ddelphi与halcon系列原创教程》Halcon的短板与delphi

    [<zw版·delphi与Halcon系列原创教程>Halcon的短板与delphi 看过<delphi与Halcon系列>blog的网友都知道,笔者对Halcon一直是非常推 ...

  3. C语言初学者代码中的常见错误与瑕疵(15)

    见:http://www.cpfn.org/bbs/viewtopic.php?f=85&t=5946&sid=0252f08a6d697fbf5a684ec5f6faf1f2 相关链 ...

  4. android 应用架构随笔六(Loading加载页面)

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.heima ...

  5. ch2-1:创建模块,并调用模块中的函数

    模块就是一个包含python代码的文本文件,文件名以.py结尾,这是python扩展名: 1.创建一个模块nester.py,文件内容为: '''这是一个模块,可以打印列表,其中可能包含嵌套列表''' ...

  6. laravel 目录结构

    图 1.1 显示了 Laravel 项目目录结构是什么样子: 图1.1 Laravel 项目目录结构 就如你看到这样,laravel下面只包含了4个文件夹,这4个文件夹下面有一些子文件夹,这种丰富的子 ...

  7. Linux批量修改用户密码

    对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用passwd user这样的命名来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect这样的 ...

  8. php中的curl】php中curl的详细解说

    本文我来给大家详细介绍下cURL的简单的使用方法,下文我将会给大家详细介绍cURL的高级应用, cURL可以使用URL的语法模拟浏览器来传输数据, FTP, FTPS, HTTP, HTTPS, GO ...

  9. android19以上和以下uri转路径的方法

    android 19以上 /** * 专为Android4.4以上设计的从Uri获取文件路径 */ public static String getPath(final Context context ...

  10. 每日一九度之 题目1023:EXCEL排序

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:18804 解决:4240 题目描述:     Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能.     对每个测试用例 ...