天天看点

连接mysql异常Communications link failure

连接mysql 数据库的时候出现这个异常Communications link failure,原因:如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。

一般的mysql数据库设置的wait_timeout时间都是8小时,(因为设置太长时间影响性能,因为改大会有返回信息延时的情况,和大量的SLEEP进程无法及时释放的问题),所以还是得从客户端这边解决问题,

网上一般给出的解决办法:

1.mysql5以前的版本可以直接在jdbc连接url的配置中附加上“autoReconnect=true”。

2.将mysql的全局变量wait_timeout的值修改为最大。查看mysql5的手册,发现windows和linux下wait_timeout的最大值分别是24天和365天。

(1).在文件my.ini的最后增加一行:wait_timeout=1814400。(该文件,windows下在mysql的安装目录下,linux下位置为/etc/my.ini)

(2).重启mysql。

还有说把ip改成localhost的,因为我连的数据库不是我自己本地的,所以这种情况也就没有尝试

而且由于数据库是第三方提供的,他们也不给改等待时间

所以只好再想办法。

我的方法就是每次连得时候都去校验有效性,c3p0连接池配置加属性

<property name="testConnectionOnCheckin"> 
                     <value>true</value> 
	</property> 
    <property name="idleConnectionTestPeriod"> 
                      <value>60</value> 
	</property> 
     <property name="testConnectionOnCheckout"> 
                      <value>true</value> 
	</property> 
    <property name="maxIdleTime"> 
                      <value>28000</value> 
    </property> 
           

这些属性解析:

testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false。

idleConnectionTestPeriod: 连接池每隔60秒自动检测数据库连接情况,如果断开则自动重连。

testConnectionOnCheckout: 因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都

将校验其有效性。

maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0;

这个肯定是要设置的<=wait_timeout 了