免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5585 | 回复: 0
打印 上一主题 下一主题

MySQL server has gone away 处理的几种方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-15 13:48 |只看该作者 |倒序浏览
出现这种错误是因为,mysql server关闭了该连接,如果客户端程序在默认的8小时内进行任何数据库操作的话。解决方法有:

1、修改mysql server的my.cnf,通过修改wait_timeout,interactive_timeout,来设置延长超时时间,但是个人不建议这么做,这种操作会导致存在很多的数据库连接存在,影响数据库的性能;

   设置方法为:

      [mysqld]

      wait_timeout=5
      interactive_timeout = 5


       需要两个变量同时进行设置;


2、设置数据库选项,当连接断开时进行重新连接。



       char nvalue = 1;

        if(mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&nvalue))
                printf("mysql_options/r/n");


3、执行数据库操作前,ping一下数据库,如果数据库无法连接,则断开连接,然后再重启连接。



     if(mysql_ping(sqlsock) != 0){    //reconnect failed...Then try connect
                   CloseDB();

                  if((sqlsock = mysql_real_connect(&mysql,DBHOST,DBUSER,DBPASSWORD,DBNAME,0,NULL,CLIENT_INTERACTIVE)) == NULL)
                  {
                        fprintf(stderr,"Can't connect to mysql sever! ErrorCode:%s/r/n",mysql_error(&mysql));

                        return -1;
                 }
                  printf("ConnectDB/r/n");
        }



          为保险起见,我采用重启连接之间进行关闭连接;

        对于这种方法,个人建议采用一个线程每隔一定的时间来ping一下, 如果ping不通,则重新进行连接操作。

  

4、跟第一种方法类似,也是设置超时的时间,只是这个超时时间只是对本连接有效;

           mysql_options(&mysql,MYSQL_INIT_COMMAND,"set interactive_timeout = 15");      
           mysql_options(&mysql,MYSQL_INIT_COMMAND,"set wait_timeout = 15");




备注:当客户端与服务器之间的连接断开的时候(比如拔掉网线),待网络恢复正常后,连接仍然存在,这是tcp的重传机制在起作用,tcp的重传时间,本机测试超过了10分钟的短线,恢复后仍然正常。

     1) 没有找到设置tcp重传时间的参数。有知道可以跟帖;

     2) 如何人为断开数据库连接的情形,本人也没有找到好的方法,稍后可能会测试一下如果长时间断网,如何去恢复数据库连接(打算ping数据库的方法来尝试一下)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP