當您嘗試將語句傳送到伺服器執行時,如果 MySQL 用戶端函式庫發現連線已中斷,它可以執行自動重新連線到伺服器的動作。如果啟用自動重新連線,函式庫會嘗試重新連線到伺服器一次,然後再次傳送語句。
自動重新連線功能已被棄用。相關的 MYSQL_OPT_RECONNECT
選項仍然可用,但現在如果您的應用程式使用此選項呼叫 mysql_get_option()
或 mysql_options()
函式,即使設定為 false,也會將棄用警告傳送到標準錯誤輸出。
預期自動重新連線功能會在未來版本的 MySQL 中移除。
預設會停用自動重新連線。
如果連線已中斷,mysql_ping()
的效果取決於自動重新連線的狀態。如果啟用自動重新連線,mysql_ping()
會執行重新連線。否則,它會回傳錯誤。
某些用戶端程式可能會提供控制自動重新連線的功能。例如,mysql 預設會重新連線,但是可以使用 --skip-reconnect
選項來抑制此行為。
如果確實發生自動重新連線 (例如,由於呼叫 mysql_ping()
所導致),則沒有明確的指示。若要檢查是否已重新連線,請呼叫 mysql_thread_id()
以取得呼叫 mysql_ping()
前的原始連線識別碼,然後再次呼叫 mysql_thread_id()
以查看識別碼是否已變更。
自動重新連線可能很方便,因為您不需要實作自己的重新連線程式碼,但是如果發生重新連線,伺服器端的連線狀態有多個方面會重設,而且您的應用程式不會收到通知。
重新連線會以下列方式影響連線相關狀態
回復任何活動中的交易並重設自動提交模式。
釋放所有資料表鎖定。
關閉 (並捨棄) 所有
TEMPORARY
資料表。將工作階段系統變數重新初始化為對應的全域系統變數的值,包括由
SET NAMES
等語句隱式設定的系統變數。遺失使用者定義的變數設定。
釋放預備語句。
關閉
HANDLER
變數。將
LAST_INSERT_ID()
的值重設為 0。釋放使用
GET_LOCK()
取得的鎖定。遺失用戶端與效能架構
threads
資料表列的關聯,該資料表列決定連線執行緒檢測。如果用戶端在斷線後重新連線,工作階段會與threads
資料表中的新列相關聯,而且執行緒監控狀態可能不同。請參閱 threads 資料表。
如果發生重新連線,會重新執行呼叫 mysql_options()
並使用 MYSQL_INIT_COMMAND
選項指定的任何 SQL 語句。
如果連線中斷,如果伺服器尚未偵測到用戶端已不再連線,則與伺服器端連線相關聯的工作階段可能會仍在執行中。在這種情況下,原始連線持有的任何鎖定仍然屬於該工作階段,因此您可能會想要呼叫 mysql_kill()
來終止它。