现在的位置: 首页 > 综合 > 正文

MySQL server has gone away

2012年02月26日 ⁄ 综合 ⁄ 共 1395字 ⁄ 字号 评论关闭

出现这种错误是因为,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数据库的方法来尝试一下)。

 

 

 

 

 

 

抱歉!评论已关闭.