运营环境测试的时候发现了一个小问题,就是连续发出几个请求的话,除了第一个请求以外,其他几个请求虽然成功,但是没有存到数据库里,查看日志发现写着Mysql has gone away。。insert into table set (@#$%^&)
Mysql连接怎么会断呢?
经过一番搜索,发现了3种可能会导致Mysql has gone away的原因
1) 服务器内存不够,导致连接数过多会自动断掉
询问了SE,发现服务器是CPU8核 16G内存,排除这个可能性
2) max_allowed_packet设置太小,使得这个INSERT Query执行失败
用show global variables like ‘max_allowed_packet’查看发现设置是16M,我的Query不可能有16M大,排除
3) wait_timeout设定值太低
用show global variables like ‘%wait_timeout%‘查看发现只有10,虽然不确定是这个问题,但还是把这个设置改成了60
重新测试,成功。
但是我还是不明所以,为什么改成60就成功,10就失败了呢?
有一点我发现了,就是发出请求的时候,有一个认证的过程,但是有时候认证非常耗费时间(大概10秒左右),那个逻辑自己就用掉了这么多时间,所以最后到了INSERT的时候SESSION就被自动关闭了,但是这个10秒的机制是怎么运作的呢?
查看网上的博客发现mysql_connect函数会被之前的session影响,就是说如果用相同的参数再次执行该函数的时候,生成的不是一个新的link,而是原来的link,而原来的link10秒就过期了。解决的方法是给mysql_connect()的参数加上New_link Flag,具体是
原来 : mysql_connect($IP, $USER, $PASSWORD)
修改后 : mysql_connect($IP, $USER, $PASSWORD, TRUE)
现在这个项目使用的是Codeigniter2,具体mysql_connect是怎么执行的还得扒一扒源码,还好问题是解决了,希望后来人不要踩这个坑~
原文:https://blog.51cto.com/6768604/2444932