程序客户端使用长连接链接到Mysql服务器,空闲一个晚上,客户端再次查询的时候,就会提示错误:
Error Code: 2006 – MySQL server has gone away
原因
造成Mysql连接超时错误,可能有2个:
1. 通信缓冲区太小。
SQL语句太大,以致超过了max_allowed_packet的大小,这种情况的话,就修改my.cnf中参数即可。
max_allowed_packet参数约定了允许客户端使用的通信缓冲区大小。通信缓冲区必须足够大,足以包含1条SQL语句(用于客户端-服务器通信)以及1行返回的数据(用于服务器-客户端通信)。如果不使用BLOG等二进制字段,一般不至于缓冲区溢出。
2. 连接空闲时间太长。
客户端两次操作数据库的时间间隔如果超过服务器规定的空闲时间,就会出现这个错误。Mysql配置文件有2个系统参数与连接空闲设置相关:
interactive_timeout
服务器在关闭连接前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户,默认数值是28800。
wait_timeout
服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果连接一致空闲,服务器在 8个小时后关闭连接。
在Mysql中使用“show processlist”,可以看到有Sleep状态的进程。这些连接其实就是在空闲中并且等待wait_timeout时间后,服务器就断开连接。
空闲超时解决办法
1. 增大wait_timeout的值
这种方式最简单,但可能会造成Mysql连接资源上的浪费。如果业务上有大量这种长连接,就会造成大量Mysql连接空闲,甚至出现“Too many connections”的错误。
2. 程序增加超时处理逻辑
客户端Mysql长连接一般使用的是线程池管理,使用连接的时候更新连接使用时间戳。可以新增一个线程,定时扫描所有长连接,如果空闲时间超过一定值,就主动连接数据库一次。
3. 使用mysql_ping()
利用Mysql提供的Api方法mysql_ping()。该函数检查与服务器的连接是否工作。如果连接丢失,将自动尝试再连接。mysql_ping()并不能自动重连,而是需要客户端判断连接不正常后手动处理:
if (!mysql_ping(pMysql)) {
mysql_close(pMysql); // 先关闭非正常连接
pMysql = mysql_real_connect(…); //重新链接
}
转载本站文章请注明,转载自:神秘果
本文链接: http://www.shenmiguo.com/archives/2009/270_mysql-server-has-gone-away.html

Leave a Reply