mysql "Communications link failure due to underlying exception"异常

mysql Communications link failure due to underlying exception错误Communications link failure due

mysql "Communications link failure due to underlying exception"错误
Communications link failure due to underlying exception

原因:Mysql服务器默认的“wait_timeout”是8小时,如果connection空闲超过8个小时,Mysql将自动断开该 connection。
在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0中的该connection仍然存在,如果这时有 Client请求connection,
C3P0将该断开的Connection提供给Client,将会造成上面的异常。
  
可以这么解决该问题:
使得Connection pools中connection的lifetime与Mysql的wait_timeout时间达到一致,或者测试Connection pools中connection的有效性。
在wait_timeout的时间为8小时的情况下:
C3P0增加以下配置信息:

//set to 'SELECT 1'     
preferredTestQuery = 'SELECT 1'  
//set to something much less than wait_timeout, prevents connections from going stale  
idleConnectionTestPeriod = 18000    
//set to something slightly less than wait_timeout, preventing 'stale' connections from being //handed out  
maxIdleTime = 25000  
//if you can take the performance 'hit', set to "true"  
testConnectionOnCheckout = true   

MySQL连接如果8小时未使用,在查询使用到该连接会报:

异常名称:com.mysql.jdbc.CommunicationsException
异常信息: Communications link failure due to underlying exception

如果是MySQL5以前的版本,需要修改连接池配置中的URL,添加autoReconnect=true

如果是MySQL5 以后的版本,需要修改my.cnf(或者my.ini)文件,在[mysqld]后面添加

wait_timeout = 172800
interactive-timeout = 172800

单位都是秒,记得必须都添加,否则不起作用,通过show variables查看wait_timeout的值。