DBCP数据库连接失效的解决方法(Io 异常:Connection reset)
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)相关推荐
- 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 ...
- java.sql.SQLRecoverableException:Io 异常: Connection reset
解决: 将D:\jdk\jdk-1.7.32\jre\lib\security\java.security文件中的 windows 系统:securerandom.source=file:/dev/u ...
- nvm 装 nodejs 重启终端失效的解决方法
nvm 装 nodejs 重启终端失效的解决方法 参考文章: (1)nvm 装 nodejs 重启终端失效的解决方法 (2)https://www.cnblogs.com/zhangkunweb/p/ ...
- 联想笔记本Win10 F1-F12失效的解决方法
联想笔记本Win10 F1-F12失效的解决方法 参考文章: (1)联想笔记本Win10 F1-F12失效的解决方法 (2)https://www.cnblogs.com/expiator/p/633 ...
- margin-top失效的解决方法
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 我的是属于这种情况 按照网上的说法,我就是这个现象了 两个层box1和box2,b ...
- Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法
Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 在添加完之后,可以使用 $.parser.parse();这个方法进行处理: (1) 对整个页面重新渲染: $.parser ...
- netty解决方法 io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1
netty解决方法 io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1 参考文章: (1)netty解决方法 i ...
- win11快捷键失效怎么办 windows11快捷键失效的解决方法
我们经常会使用快捷键来帮助我们快速地打开所需要的应用,提高使用效率,但是有小伙伴在使用的时候发现快捷键失效,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧.更多windows11系 ...
- 关于更新win11 22H2后透明任务栏失效的解决方法.2023.03.15
关于更新win11 22H2后透明任务栏失效的解决方法2023.03.15 [ViVe Tool下载地址]{Releases · thebookisclosed/ViVe (github.com)} ...
- VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法
VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法 在VSCode中,新建js文件可能会发生VSCode自带的jQuery提示引起失效,如下图 在HTML文件中进行编辑,<s ...
最新文章
- java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法
- linux格式化文件,无需格式化就可以转换文件系统
- Linux 进程状态详解
- 通过Log4net来配置我们需要的日志文件格式
- 【模型加速】TensorRT安装、测试及常见问题
- 在递归中使用Continuation来避免StackOverflow(查找第K大的数)
- 机器学习7/100天-K近邻算法
- 开源操作系统 FreeDOS 二十五年演进史:因微软抛弃 MS-DOS 而来!
- android youtube免谷歌,youtube免谷歌框架
- quartus软件使用—error:top-level design entity “xxx” is undefined
- 400企业智能服务器,全球领先的企业级服务器、存储、融合系统及解决方案-H3C与HPE...
- 编程需要知道多少数学知识?
- 它来啦,它来啦!三子棋小游戏来啦!!!
- Windows系统设置定时任务
- 走出计算机安全防范的六个误区
- [图形学] 基于图像的照明:漫反射辐照度
- 孩子肝火大脾气急,怎么办?
- 医疗供应链-药品SPD管理
- Windows 文件共享
- 系统架构领域的一些学习材料-林仕鼎
热门文章
- javascript设计模式-装饰者模式
- ajax(form)图片上传(spring)
- 6st 关于css中的常见单位简介
- iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
- 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】
- Linux crontab 定时任务详解
- 网站设计中面包屑导航条的使用和设计
- XML 处理利器 : XStream
- 使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体
- mysqldump怎么用 mysqldump没反应 mysqldump语法错误 mysqldump备份 mysql恢复 source命令 采用Navicat备份与mysqldump备份的区别...