您的位置:首页 > 数据库 > MySQL

c3p0连接池连接MySql数据库时,无请求自动断开连接的解决方案

2015-08-29 20:57 691 查看
作为一个程序员要养成些笔记的习惯,记录自己遇到的一些问题,这样才能一步一步由菜鸟成长为大牛!今天主要讲述项目中使用c3p0连接池遇到的一些问题。

1.错误现象描述与错误日志

项目部署好后,我进行插入数据的操作,一切是正常的!后来出去了下,喝了杯茶,回来再测试,呵呵….想不到的是程序报错了…此时,心中一万只草泥马在奔腾,但是我们还是要冷静下来,先看看日志



日志的核心在于:

(1)com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

(2)The last packet successfully received from the server was 2,562,038 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago


那么原因就很明显了!

2.原因查找与分析

此时我默默的打开自己的c3p0配置,发现就写了这几行

c3p0.named-configs.test.jdbcUrl=jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull
c3p0.named-configs.test.password=root
c3p0.named-configs.test.user=root
c3p0.named-configs.test.maxPoolSize=30


在进入自己的数据库,查看wait_timeout时间

SHOW VARIABLES  LIKE '%wait_timeout%'


结果如下:



此时结果不言而喻:我的MySQL服务器设置的“wait_timeout”是120,这意味着一个连接的空闲时间为2分钟,两分钟后MySQL将自动断开该连接,而我在c3p0中没有设置idleConnectionTestPeriod,没有设置idleConnectionTestPeriod默认为0,也就是说c3p0不检查连接的有效性,当应用申请使用该连接时,就会导致上面的报错。

3.解决方法

网上的解决方法很多,在这里我列举自己使用的两条。

(1)修改mysql的wait_timeout

修改mysql安装目录下的配置文件 my.ini文件,设置

wait_timeout=2147483


备注:

默认的“wait_timeout”是28800秒即8小时;

2147483为最大允许值;

(2)修改c3p0的配置

设置c3p0中连接池内连接的生存周期(idleConnectionTestPeriod)小于数据库中的wait_timeout的值

如我的数据wait_timeout=120;c2p0的配置改为

c3p0.named-configs.test.idleConnectionTestPeriod=60


网上貌似还有其他的解决方法,在这里建议使用第二种。因为公司线上的数据库都是DBA管着,你想改人家还不同意呢,还是自谋出路啊!

后记:至于c3p0的其他配置可以参考http://blog.csdn.net/caihaijiang/article/details/6843496
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: