天天看点

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案基本问题解决知识扩展

本文提供了对c3p0与dbcp连接池连接mysql数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用dbcp连接池的解决方案。

java web项目框架为spring mvc+jpa,使用c3p0连接池,发布环境为tomcat 7

项目运行一段时间(大概几个小时)之后访问时会出现第一次访问报错,再次访问正常的现象,且多次出现此问题。

mysql服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,mysql将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。

修改mysql安装目录下的配置文件 my.ini文件(如果没有此文件,复制“my-default.ini”文件,生成“复件 my-default.ini”文件。将“复件

my-default.ini”文件重命名成“my.ini” ),在文件中设置: 

这两个参数的默认值是8小时(60*60*8=28800)。

注意: 1.wait_timeout的最大值只允许2147483 (24天左右)

2.修改配置文件为网上大部分文章所提供的方式,也可以使用mysql命令对这两个属性进行修改

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案基本问题解决知识扩展
使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案基本问题解决知识扩展
使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案基本问题解决知识扩展

减少连接池内连接的生存周期,使之小于上一项中所设置的wait_timeout

的值。 

修改 c3p0 的配置文件,在 spring 的配置文件中设置:

定期使用连接池内的连接,使得它们不会因为闲置超时而被 mysql 断开。 

修改 c3p0 的配置文件,在 spring 的配置文件中设置:

c3p0是一个开放源代码的jdbc连接池,它在lib目录中与hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的connection 和statement 池的datasources 对象。 c3p0配置文件

修改l配置文件:

修改如下:

     其中testonborrow

和 validationquery 很重要。

testonborrow的意思是从数据库连接池中取得连接时,对其的有效性进行检查。

validationquery 是用来检查的sql语句,“select 1”执行较快,是一个不错的检测语句。

当测试人员反映到这个问题的时候,很快就锁定了mysql八小时的问题,但是解决方案却费了我不小功夫,先是考虑到修改mysql配置文件肯定是不太合理的,弃之。

然后想了一下在一个servlet中写了个定时器,让它每两小时查一下数据库,运行了几天发现问题仍然存在,将定时器间隔时间修改为30分钟、3分钟仍然无济于事,异常照常出现,弃之。

在网上搜了一下解决方案也挺多,把

写入到配置文件中,运行报错,说bean中没有这两个属性,查看了一下原来是我用的c3p0连接池,而这个解决方案是针对dbcp连接池的。

最后在配置文件中,添加了

成功解决了问题。

感悟,问题很简单,就是改个配置文件,但是遇到问题需要快速解决问题的能力,更需要认真的态度。

继续阅读