出現這種錯誤是因為,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資料庫的方法來嘗試一下)。