数据库空闲连接超过最大wai_timemout时间,数据库会强行断开空闲的链接,dbcp解决方案

原创 2013年12月05日 10:06:47

虚拟空间的mysql数据库常设得很低,如wait_timeout=100,在java web 应用中使用dbcp做为连接池,当数据库重启或数据库连接超过设置的最大timemout时间,数据库会强行断开已有的链接,此时当web程序访问数据库时就会出现错误,大致的错误信息java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost,原因是数据库这边已有的连接强行断开,而连接池中不知道已经断开,还是从连接池取出数据库连接交给程序去执行数据库操作,所以导致出错。且我们无法修改配置,这时只能在dbcp连接池上做一些配置。

解决原理:

在构造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也会使用GenericObjectPool]时,会生成一个内嵌类Evictor,实现自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每过 timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查连接池中的连接的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle如果连接池的连接数小于最小空闲连接数,则创建数据库连接,同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入连接池中,否则销毁此对象。
参数说明
timeBetweenEvictionRunsMillis (设置的Evict线程的时间,单位:毫秒,即每隔多少时间去检测一次空闲连接是否超时,默认值为-1,即不开启)
minEvictableIdleTimeMillis (空闲逐出连接池的时间,单位:毫秒,默认30分钟)
numTestsPerEvictionRun (设定在进行后台对象清理时,每次检查几个链接。默认值是3.
如果numTestsPerEvictionRun>=0, 则取numTestsPerEvictionRun 和池内的链接数 的较小值 作为每次检测的链接数
如果numTestsPerEvictionRun<0,则每次检查的链接数是检查时池内链接的总数乘以这个值的负倒数再向上取整的结果。)
举例:
              XX系统的数据库Mysql,dba设置的超时空闲失效时间是100秒(MYSQL如果不设置,默认的是8小时),未加以下参数之前经常报链接失效的错误,加上以下配置后,即可解决。timeBetweenEvictionRunsMillis=48  minEvictableIdleTimeMillis=90,因此当空闲连接在96秒的时候会被检查到超过90秒随后被逐出,然后则创建新的数据库连接。因此timeBetweenEvictionRunsMillis一定要小于100秒,否则检查不出失效连接,但这里也不能设置为51秒,因为第二次检测已经102秒,连接池连接在100秒时就已经与数据库断开!minEvictableIdleTimeMillis要小于100秒,即赶在失效前逐出。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

分布式锁的实现方式

在进行大型网站技术架构设计以及业务实现的过程中,多少都会遇到需要使用分布式锁的情况。那么问题也就接踵而至。分布式锁zk和memcached以及redis三者都能实现,同样是分布式锁,三者的区别何在?各...

分布式锁的基本原理

基本概念: 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,...

关于数据库连接池的最大空闲时间的配置

关于数据库连接池的最大空闲时间的配置 java的所有的连接池 无论是c3p0、dbcp还是druid,都有一个类似maxWait或者maxIdleTime配置项。具体含义就是当连接长时间没有向服...

MySQL dbcp 下连接空闲8小时自动断开问题解决方案

一项目用Mysql+S2SH,数据源用dbcp,部署好后,运行了一夜吧,第二天就报错,log显示大致就是 System Runtime Error: Could not open Hibernate...

MySQL+Hibernate下连接空闲8小时自动断开问题解决方案

本文转自http://blog.sina.com.cn/s/blog_6e6bbaf20100uocd.html,所有权利归原作者所有。 前段时间刚完成一个项目,数据库为MySQL5.0,持...

mysql空闲等待时间导致的问题的解决方案

一、问题出现原因     show global variables like '%wait_timeout'; 可以查看数据库空闲等待时间,默认8小时,最大2147483,接近24天,即某程序连接数...

时间空闲的选择器算法

刚看到有个求空余时间的帖子,于是着手写了一下,话不多说直接贴代码。以后只求以后自己遇到的时候可以不用再写了 package com.study.test; import java.text.Par...

关于DBCP断网数据库连接失效的解决方案

问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什么BUG,只有一部分人说数据库如果因为某种原因断掉后再DBCP取道的连接都是失效的连接,而没有重新取。就此研读了一下DBCP的代码,共享之...

查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件

标题:查看Oracle数据库表空间大小,是否需要增加表空间的数据文件    在数据库管理中,磁盘空间不足是DBA都会遇到的问题,问题比较常见。   --1查看表空间已经使用的百分比 SELEC...
  • ygj26
  • ygj26
  • 2012-05-29 08:39
  • 651

查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件

Oracle10g10.2.0.1.0 标题:查看Oracle数据库表空间大小,是否需要增加表空间的数据文件    在数据库管理中,磁盘空间不足是DBA都会遇到的问题,问题比较常见。  ...
  • w__yi
  • w__yi
  • 2011-12-21 16:09
  • 152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)