3.6.8 自動重新連線控制

當您嘗試將語句傳送到伺服器執行時,如果 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() 來終止它。