2016-06-27 9 views
0

コマンドプロンプトでxをクリックしてMySQLシェルを閉じただけで、ウィンドウを閉じるときにデータベース接続に何が起こるのか不思議です。接続が「終了」しているとき、MySQLはどのように知っていますか?

私は、MySQLサーバは、私が正しく理解していれば、サーバーが接続要求を待ち、接続を管理するための新しいスレッド/利用できるスレッドに渡し、ポート3306で実行されていることを知っています。接続が終了している場合は、スレッドを解放または使用可能なスレッドのプールに戻すことができるように

は、どのようにサーバは、知っているのですか?など

シナリオ:リモート接続上のMySQLサーバとの接続時に

  1. ブルースクリーン。
  2. 切断要求を呼び出す前にプログラムが終了しました。 mysqlクライアントから
+1

。 –

+0

@ MarcB接続がアクティブであるかどうかを確認するためにワーカースレッドがあらゆる間隔で何らかのポーリングを行っていると想像してもらえますが、アイドル状態の接続が多い場合は少し高額に見えます。多くのアクティブな接続があると想像することはできますが、データベースへのアクセス方法はより大きな問題の兆候です(データベースに接続して永久に開くことはほとんどできないため、ほとんどの要求は特定の間接的な要求)。 – Dmitry

答えて

1

show processlist; 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 
| Id | User | Host   | db   | Command | Time | State | Info    | 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 
| 2 | root | localhost:6509 | so_gibberish2 | Sleep | 105 |  | NULL    | 
| 3 | root | localhost:6510 | so_gibberish2 | Sleep | 105 |  | NULL    | 
| 820 | root | localhost:40286 | stackoverflow | Sleep | 13457 |  | NULL    | 
| 821 | root | localhost:40287 | stackoverflow | Sleep | 966 |  | NULL    | 
| 827 | root | localhost:42254 | so_gibberish2 | Query |  0 | init | show processlist | 
| 831 | root | localhost:44036 | stackoverflow | Sleep | 230 |  | NULL    | 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 

select connection_id(); 
+-----------------+ 
| connection_id() | 
+-----------------+ 
|    827 | 
+-----------------+ 

今ヒット[X]あなたは、クライアントに上記を実行したmysqlクライアントを言うように。以下は

MySQLのワークベンチからです:

show processlist; 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 
| Id | User | Host   | db   | Command | Time | State | Info    | 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 
| 2 | root | localhost:6509 | so_gibberish2 | Sleep | 105 |  | NULL    | 
| 3 | root | localhost:6510 | so_gibberish2 | Sleep | 105 |  | NULL    | 
| 820 | root | localhost:40286 | stackoverflow | Sleep | 13457 |  | NULL    | 
| 821 | root | localhost:40287 | stackoverflow | Sleep | 966 |  | NULL    | 
+-----+------+-----------------+---------------+---------+-------+-------+------------------+ 
select connection_id(); 
+-----------------+ 
| connection_id() | 
+-----------------+ 
|    3 | 
+-----------------+ 

だから、プログラムの終了は当然それが持っている任意の開いているソケットを閉じます。

正直なところ、後者の出力は、より次のようになります。 enter image description here

しかし、私は常に結果を投げるだろうテーブルの書式出力用のmysqlクライアントを使用しています。そこであなたはそれをイメージとして持っています。 OSは、TCPソケットをクリーンアップします、またはそれが何かを送信しようと戻って、ネットワークスタックからの不良が発生した際にMySQLがわかりますいくつかの点で

+0

ソケットが閉じるのは正常ですか。クライアントの要求を処理する接続スレッドはどうなりますか? – Dmitry

+0

TCP(私がまだ調査中の名前付きパイプと比較して)の場合はそうです。しかし、TCPの場合、接続されたソケットがあります。そのソケットが切断されると(どちらの側でも閉じることができます)、もう一方の側ではクロージャの警告イベントを受け取ります。それでその時点で、それが行われます。どちらの場合も、サーバーはスレッドを破棄します。これは、サーバーとクライアントの部分を書くソケットコミュニケーションのジェーンの普通の記述と変わりません。 – Drew

+0

「サーバーがなくなった」場合、これは単なる接続タイムアウトの問題です。クライアント(それは何でも、mysqlのクライアントコマンドライン、Toad、Workbench)、それもその状態を知っています。それは単に再認証し、コマンドを続行するだけです。しかし両陣営は、真実のつながりがない状態を認識しており、糸は吹き飛ばされている。 – Drew

関連する問題