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

作为一个程序员要养成些笔记的习惯,记录自己遇到的一些问题,这样才能一步一步由菜鸟成长为大牛!今天主要讲述项目中使用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

备注:

  1. 默认的“wait_timeout”是28800秒即8小时;
  2. 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值