- 論壇徽章:
- 0
|
出現(xiàn)這種錯誤是因為,mysql server關(guān)閉了該連接,如果客戶端程序在默認(rèn)的8小時內(nèi)進行任何數(shù)據(jù)庫操作的話。解決方法有:
1、修改mysql server的my.cnf,通過修改wait_timeout,interactive_timeout,來設(shè)置延長超時時間,但是個人不建議這么做,這種操作會導(dǎo)致存在很多的數(shù)據(jù)庫連接存在,影響數(shù)據(jù)庫的性能;
設(shè)置方法為:
[mysqld]
wait_timeout=5
interactive_timeout = 5
需要兩個變量同時進行設(shè)置;
2、設(shè)置數(shù)據(jù)庫選項,當(dāng)連接斷開時進行重新連接。
char nvalue = 1;
if(mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&nvalue))
printf("mysql_options/r/n");
3、執(zhí)行數(shù)據(jù)庫操作前,ping一下數(shù)據(jù)庫,如果數(shù)據(jù)庫無法連接,則斷開連接,然后再重啟連接。
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");
}
為保險起見,我采用重啟連接之間進行關(guān)閉連接;
對于這種方法,個人建議采用一個線程每隔一定的時間來ping一下, 如果ping不通,則重新進行連接操作。
4、跟第一種方法類似,也是設(shè)置超時的時間,只是這個超時時間只是對本連接有效;
mysql_options(&mysql,MYSQL_INIT_COMMAND,"set interactive_timeout = 15");
mysql_options(&mysql,MYSQL_INIT_COMMAND,"set wait_timeout = 15");
備注:當(dāng)客戶端與服務(wù)器之間的連接斷開的時候(比如拔掉網(wǎng)線),待網(wǎng)絡(luò)恢復(fù)正常后,連接仍然存在,這是tcp的重傳機制在起作用,tcp的重傳時間,本機測試超過了10分鐘的短線,恢復(fù)后仍然正常。
1) 沒有找到設(shè)置tcp重傳時間的參數(shù)。有知道可以跟帖;
2) 如何人為斷開數(shù)據(jù)庫連接的情形,本人也沒有找到好的方法,稍后可能會測試一下如果長時間斷網(wǎng),如何去恢復(fù)數(shù)據(jù)庫連接(打算ping數(shù)據(jù)庫的方法來嘗試一下)。 |
|