2019独角兽企业重金招聘Python工程师标准>>>

网上很多评论说DBCP有很多BUG,但是都没有指明是什么BUG,只有一部分人说数据库如果因为某种原因断掉后再DBCP取道的连接都是失效的连接,而没有重新取。有的时候会报Io 异常:Connection reset。

解决方法:

spring中datasource的配置如下:
    <bean id="dispatchdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="jdbc:oracle:thin:@127.0.0.1 :1521:myserver" /> 
    <property name="username" value="user1" /> 
    <property name="password" value="pwd" /> 
    <property name="maxActive" value="10000" /> 
    <property name="maxIdle" value="30" /> 
     <property name="minIdle" value="2" /> 
    <property name="maxWait" value="600000" /> 
    <property name="testOnBorrow" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="validationQuery" value="select 1 from dual"/> 
</bean>

分析:

DBCP使用apache的对象池ObjectPool作为连接池的实现,有以下主要的方法

Object borrowObject() throws Exception;从对象池取得一个有效对象

void returnObject(Object obj) throws Exception;使用完的对象放回对象池

void invalidateObject(Object obj) throws Exception;使对象失效

void addObject() throws Exception;生成一个新对象

ObjectPool的一个实现就是GenericObjectPool,这个类使用对象工厂PoolableObjectFactory实现对象的生成,失效检查等等功能,以其实现数据库连接工厂PoolableConnectionFactory做以说明,主要方法:

Object makeObject() throws Exception; 使用ConnectionFactory生成新连接

void destroyObject(Object obj) throws Exception;关闭连接

boolean validateObject(Object obj); 验证连接是否有效,如果_validationQuery不空,则使用该属性作为验证连接是否有效的sql语句,查询数据库

void activateObject(Object obj) throws Exception;激活连接对象

void passivateObject(Object obj) throws Exception; 关闭连接生成过的Statement和ResultSet,使连接处于非活动状态

而GenericObjectPool有几个主要属性

_timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,默认-1

_maxIdle:对象池中对象最大个数

_minIdle:对象池中对象最小个数

_maxActive:可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8

在构造GenericObjectPool时,会生成一个内嵌类Evictor,实现自Runnable接口。如果 _timeBetweenEvictionRunsMillis大于0,每过_timeBetweenEvictionRunsMillis毫秒 Evictor会调用evict()方法,检查对象的闲置时间是否大于 _minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30 分钟),是则销毁此对象,否则就激活并校验对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。在调用 returnObject方法把对象放回对象池,首先检查该对象是否有效,然后调用PoolableObjectFactory 的passivateObject方法使对象处于非活动状态。再检查对象池中对象个数是否小于_maxIdle,是则可以把此对象放回对象池,否则销毁此对象。

还有几个很重要的属性,_testOnBorrow、_testOnReturn、_testWhileIdle,这些属性的意义是取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证。所以当使用DBCP时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了。网上很多说 DBCP的bug应该都是如此吧,只有把这些属性设为true,再提供_validationQuery语句就可以保证数据库连接始终有效了,oracle数据库可以使用SELECT COUNT(*) FROM DUAL,不过DBCP要求_validationQuery语句查询的记录集必须不为空,可能这也可以算一个小小的BUG,其实只要_validationQuery语句执行通过就可以了。

转载于:https://my.oschina.net/sansom/blog/149068

DBCP数据库连接失效的解决方法(Io 异常:Connection reset)相关推荐

  1. Io 异常: Connection reset;Io 异常: Got minus one from a read call;IO 错误: Connection reset by peer, Authe

    报错信息: 1. IO 错误: Connection reset by peer, Authentication lapse 0 ms. 搜索网上有些回答说 是JVM随机数造成的延迟问题. 看下ket ...

  2. java.sql.SQLRecoverableException:Io 异常: Connection reset

    解决: 将D:\jdk\jdk-1.7.32\jre\lib\security\java.security文件中的 windows 系统:securerandom.source=file:/dev/u ...

  3. nvm 装 nodejs 重启终端失效的解决方法

    nvm 装 nodejs 重启终端失效的解决方法 参考文章: (1)nvm 装 nodejs 重启终端失效的解决方法 (2)https://www.cnblogs.com/zhangkunweb/p/ ...

  4. 联想笔记本Win10 F1-F12失效的解决方法

    联想笔记本Win10 F1-F12失效的解决方法 参考文章: (1)联想笔记本Win10 F1-F12失效的解决方法 (2)https://www.cnblogs.com/expiator/p/633 ...

  5. margin-top失效的解决方法

    异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 我的是属于这种情况 按照网上的说法,我就是这个现象了 两个层box1和box2,b ...

  6. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

    Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 在添加完之后,可以使用 $.parser.parse();这个方法进行处理: (1) 对整个页面重新渲染: $.parser ...

  7. netty解决方法 io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1

    netty解决方法 io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1 参考文章: (1)netty解决方法 i ...

  8. win11快捷键失效怎么办 windows11快捷键失效的解决方法

    我们经常会使用快捷键来帮助我们快速地打开所需要的应用,提高使用效率,但是有小伙伴在使用的时候发现快捷键失效,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧.更多windows11系 ...

  9. 关于更新win11 22H2后透明任务栏失效的解决方法.2023.03.15

    关于更新win11 22H2后透明任务栏失效的解决方法2023.03.15 [ViVe Tool下载地址]{Releases · thebookisclosed/ViVe (github.com)} ...

  10. VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法

    VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法 在VSCode中,新建js文件可能会发生VSCode自带的jQuery提示引起失效,如下图 在HTML文件中进行编辑,<s ...

最新文章

  1. java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法
  2. linux格式化文件,无需格式化就可以转换文件系统
  3. Linux 进程状态详解
  4. 通过Log4net来配置我们需要的日志文件格式
  5. 【模型加速】TensorRT安装、测试及常见问题
  6. 在递归中使用Continuation来避免StackOverflow(查找第K大的数)
  7. 机器学习7/100天-K近邻算法
  8. 开源操作系统 FreeDOS 二十五年演进史:因微软抛弃 MS-DOS 而来!
  9. android youtube免谷歌,youtube免谷歌框架
  10. quartus软件使用—error:top-level design entity “xxx” is undefined
  11. 400企业智能服务器,全球领先的企业级服务器、存储、融合系统及解决方案-H3C与HPE...
  12. 编程需要知道多少数学知识?
  13. 它来啦,它来啦!三子棋小游戏来啦!!!
  14. Windows系统设置定时任务
  15. 走出计算机安全防范的六个误区
  16. [图形学] 基于图像的照明:漫反射辐照度
  17. 孩子肝火大脾气急,怎么办?
  18. 医疗供应链-药品SPD管理
  19. Windows 文件共享
  20. 系统架构领域的一些学习材料-林仕鼎

热门文章

  1. javascript设计模式-装饰者模式
  2. ajax(form)图片上传(spring)
  3. 6st 关于css中的常见单位简介
  4. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
  5. 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】
  6. Linux crontab 定时任务详解
  7. 网站设计中面包屑导航条的使用和设计
  8. XML 处理利器 : XStream
  9. 使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体
  10. mysqldump怎么用 mysqldump没反应 mysqldump语法错误 mysqldump备份 mysql恢复 source命令 采用Navicat备份与mysqldump备份的区别...