今天遇到一个关于数据方面的问题,问题如下:
StatementCallback; SQL [UPDATE 。。。WHERE id= 35]; Communications link failure
Last packet sent to the server was 18896 ms ago.; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 18896 ms ago.
原因及解决方法:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
解决的方法:
1、增加wait_timeout的时间。
修改方法:MySQL通过my.ini 在
# this is myown dinifition for mysql connection timeout
wait_timeout=31536000
2、修改xml配置
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="0" />
由于mysql的连接空闲超过8个小时,所以就关闭了,但是连接池却永不丢弃连接,认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。所以重新设置value值