最近做一個項目的後台守護程序,需要多線程對mysql數據庫服務進行操作,為了加強守護撐的健壯性,特地連接成功後拔掉網線,然後測試守護程序斷開重新連接的健壯性,可是發現網絡斷開後,重新插上網線,用mysql_real_conncet進行重新連接返回的永遠是假,也就是重新連接失敗,之後我想斷開網絡後重新將mysql連接釋放(mysql_close(MYSQL )),並重新初始化mysql_init((MYSQL )),然後再用mysql_real_conncet()函數進行連接,但是這樣做的後果是mysql_real_connect()報錯,報錯內容為沒有足夠的內存,明明我的電腦還有5個G空閒內存,居然說內存不夠。。。
經過查閱資料,發現有一個叫mysql_options的函數,結合mysql_ping函數,mysql連接斷開後可以自動重新連接:
使用mysql_ping來自動檢查重連。用到兩個函數,一個是mysql_ping,另外一個是mysql_options。具體使用方法是在mysql_real_connect之前,mysql_init之後,使用mysql_options。用法如下:
char value = 1;
(void) mysql_init (&mysql);
mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);
結合百度百科的使用方法:
mysql_optins
mysql_ping
然後在以後mysql_query之前首先使用mysql_ping進行判斷,如果連接已經斷開,會自動重連,或者再查詢失敗後,執行mysql_ping函數,然後自動重新連接mysqlsever.
不過,請注意,自動重新連接也會導致一些副作用,如下:
* 任何活動的交易都被回滾,autocommit模式被置為reset。
* 所有表鎖都釋放
* 所有臨時表是關閉(撤消)
* Session variables are reinitialized to the values of the corresponding variables.會話變量被重新初始化為相應的變量。 這也影響那些隱式聲明的變量,SET NAMES。比如使用This also affects variables that are set implicitly by statements such as SET NAMES.這也影響了變量,是一套由含蓄的聲明,例如訂定的名稱。
* 用戶變量設置都將丟失。
* 編制報表釋放。
* 句柄變量被關閉。
* LAST_INSERT_ID()被重置為0 。
* 使用GET_LOCK()獲得的鎖被釋放