実行されるステートメントをサーバーに送信しようとしたときに、MySQL クライアントライブラリが接続が停止していることを検出した場合、それはサーバーへの自動再接続を実行できます。自動再接続が有効にされている場合、ライブラリは 1 回サーバーに再接続し、ステートメントを再度送信しようとします。
MySQL 5.6 では、自動再接続はデフォルトで無効にされています。
アプリケーションで、接続が切断されたことを知ることが重要な場合 (状態情報の損失に合わせて終了したり、アクションをとったりできるように)、自動再接続が無効にされるようにしてください。これを確実にするには、MYSQL_OPT_RECONNECT
オプションを使用して mysql_options()
を呼び出します。
my_bool reconnect = 0;
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);
接続が停止した場合、mysql_ping()
の効果は自動再接続の状態によって異なります。自動再接続が有効にされている場合、mysql_ping()
は再接続を実行します。そうでない場合、それはエラーを返します。
一部のクライアントプログラムでは、自動再接続を制御する機能を提供できます。たとえば、mysql はデフォルトで再接続しますが、--skip-reconnect
オプションを使用して、この動作を抑止できます。
自動再接続が行われた場合 (たとえば、mysql_ping()
の呼び出しの結果として)、その明示的な兆候はありません。再接続をチェックするには、mysql_ping()
を呼び出す前に mysql_thread_id()
を呼び出して、元の接続識別子を取得してから、再度 mysql_thread_id()
を呼び出して、識別子が変更されているかどうかを確認します。
自動再接続は、独自の再接続コードを実装する必要がないため、便利な場合がありますが、再接続が行われる場合、サーバー側で接続状態のいくつかの側面がリセットされ、アプリケーションに通知されません。
接続関連の状態は、次のように影響を受けます。
アクティブなトランザクションがすべてロールバックされ、自動コミットモードがリセットされます。
すべてのテーブルロックが解除されます。
すべての
TEMPORARY
テーブルが閉じられ (さらに削除され) ます。セッションシステム変数は、
SET NAMES
などのステートメントによって暗黙的に設定されるシステム変数を含む、対応するグローバルシステム変数の値に再初期化されます。ユーザー変数設定が失われます。
プリペアドステートメントがリリースされます。
HANDLER
変数が閉じられます。LAST_INSERT_ID()
の値が 0 にリセットされます。GET_LOCK()
によって取得されたロックが解放されます。接続スレッドインストゥルメンテーションを判断するパフォーマンススキーマ
threads
テーブル行とクライアントの関連付けが失われます。クライアントが切断後に再接続した場合、セッションはthreads
テーブル内の新しい行に関連付けられるため、スレッドモニタリング状態が異なることがあります。セクション22.9.10.3「スレッドテーブル」を参照してください。
接続が切断した場合、サーバーでクライアントが接続されなくなったことを検出していない場合に、サーバー側でその接続に関連付けられているセッションが引き続き実行する可能性があります。この場合、元の接続によって保持されたロックはまだそのセッションに属しているため、mysql_kill()
を呼び出して、それを強制終了する必要がある可能性があります。