2016-06-27 81 views
0

我剛剛通過在命令提示符下單擊x來關閉MySQL shell,現在我好奇關閉窗口時數據庫連接會發生什麼。MySQL如何知道連接何時「結束」?

我知道MySQL服務器在端口3306上運行。如果我理解正確,服務器會等待連接請求並將它們傳遞給新線程/可用線程以管理連接。

服務器如何知道連接何時終止,以便線程可以被釋放或放回到可用線程池中?

方案如:

  1. 遠程連接上與MySQL服務器的連接期間藍屏。
  2. 程序在它可以調用斷開請求之前終止。
+1

在某些時候,操作系統將清理tcp套接字,或者當mysql嘗試發送某些內容並從網絡堆棧中獲取故障時,它會通知它。 –

+0

@MarcB我可以想象,工作線程會在每個時間間隔內進行一些輪詢以檢查連接是否處於活動狀態,如果有很多空閒連接,這似乎有點貴。雖然我可以想象有很多活動連接是數據庫訪問方面的一個更大問題的跡象(因爲很少有人可以連接到數據庫並永遠保持打開狀態,大多數請求都是通過特定的間接請求來完成的, )。 – Dmitry

回答

1

從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    | 
| 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客戶端輸出格式化,這將甩開結果表。所以你有它作爲一個圖像。

+0

好的插座確實關閉;但處理客戶端請求的連接線程會發生什麼情況? – Dmitry

+0

好吧,在TCP的情況下(與我正在調查的命名管道相比)。但對於TCP,你有一個連接的套接字。當這個套接字斷開時(任何一方都可以關閉它),那麼另一方會得到一個套接字事件來提醒封閉。所以在這一點上,它已經完成。無論是哪種情況,服務器都會放棄它的線程。這與編寫服務器和客戶端部分的套接字通信的簡單寫作沒有什麼不同。 – Drew

+0

在「服務器已經消失」的情況下,這僅僅是一個連接超時問題。客戶端(不管是什麼,mysql客戶端命令行,Toad,Workbench),它也知道這個狀態。它只是重新認證並繼續執行命令。但是雙方都意識到這種狀態,沒有真正的聯繫,線索被吹走。 – Drew