最近写了一个小的javaweb项目,做测试时突然报了Communications link failure错误,上网查阅之后发现出问题的地方在Mysql.
我使用的是C3P0连接池,当连接池创建了一个connection后就相当于有一条与数据库连接的通道,mysql默认当这个通道空闲了8小时(也就是8小时没有调用这个connection做事情)就释放它,当mysql释放了connection后,C3P0却并不知道这件事,所以他不会去释放这个错误的connection,所以当我们再次拿到这个错误的connection用它做事情的时候就会报错.
解决方法:
网上很多帖子都建议更改mysql的配置文件
打开my.ini文件,在port=3306下面加入
wait_timeout=31536000
interactive_timeout=31536000
更改mysql的等待时间,但是它的最大值只能是2147483,约为25天.
但是我用了这个方法还是会报错,参考了https://blog.csdn.net/rfjian123/article/details/18153913以后,我更改了连接池的配置文件
在C3P0的配置文件上加入
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="0"></property>
更改value的值,改为3600(一小时),这时当这个connection一小时没有活动就会被连接池释放掉,所以也不存在被mysql回收的情况了.
解决问题.