2016-06-27 9 views
0

Ich habe gerade eine MySQL-Shell geschlossen, indem ich auf x an meiner Eingabeaufforderung geklickt habe und ich bin jetzt gespannt, was mit Datenbankverbindungen passiert, wenn Sie das Fenster schließen.Woher weiß MySQL, wenn die Verbindung "vorbei" ist?

Ich weiß, dass der MySQL-Server auf Port 3306 ausgeführt wird. Wenn ich richtig verstehe, wartet der Server auf Verbindungsanforderungen und übergibt sie an einen neuen Thread/verfügbaren Thread zum Verwalten der Verbindung.

Woher weiß der Server, wann die Verbindung beendet wurde, damit der Thread freigegeben oder in einen Pool verfügbarer Threads zurückgesetzt werden kann?

Szenarien wie:

  1. Blue Screen während einer Verbindung mit einem MySQL-Server auf eine Remote-Verbindung.
  2. Programm beendet, bevor es eine Verbindungsanforderung aufrufen konnte.
+1

Irgendwann wird das Betriebssystem den tcp-Socket bereinigen, oder mysql wird bemerken, wenn es versucht etwas zu senden und einen Fehler vom Netzwerk-Stack zurückbekommt. –

+0

@MarcB Ich kann mir vorstellen, dass der Worker-Thread irgendeine Art von Abfrage über jedes Intervall ausführt, um zu prüfen, ob die Verbindung aktiv ist. Dies scheint ein wenig teuer zu sein, wenn es viele inaktive Verbindungen gibt. Obwohl ich mir vorstellen kann, dass viele aktive Verbindungen ein Zeichen für größere Probleme beim Zugriff auf die Datenbank sind (da sich nur wenige mit Ihrer Datenbank verbinden und sie für immer offen halten können, werden die meisten Anfragen über spezifische indirekte Anfragen ausgeführt, die etwas tun und trennen). – Dmitry

Antwort

1

aus dem MySQL-Client:

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 | 
+-----------------+ 

Jetzt schlagen [x], wie Sie sagen, dass das MySQL-Client zu Client, der die oben lief.

Unten finden von Mysql Workbench:

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 | 
+-----------------+ 

So das Schließen eines Programms schließt natürlich alle geöffneten Buchsen hat.

Ehrlich gesagt, sieht diese Ausgabe mehr wie: enter image description here

Aber ich immer das MySQL-Client für die Ausgabe für Tabellen Formatierung verwenden, die die Ergebnisse abwerfen würden. Da hast du es als Bild.

+0

Ok, der Socket wird geschlossen; Aber was passiert mit dem Verbindungsthread, der Clientanforderungen verarbeitet? – Dmitry

+0

ok also im Falle eines TCP (gegen Named Pipes, die ich noch untersuche). Aber für TCP haben Sie einen verbundenen Socket. Wenn dieser Socket getrennt wird (beide Seiten können ihn schließen), erhält die andere Seite eine Socket-Ereignisbenachrichtigung des Abschlusses. An diesem Punkt ist es getan. Der Server verwirft in jedem Fall seinen Thread. Es ist nicht anders als jede normale Jane schreiben eine Socket-Kommunikation, wo Sie den Server und Client-Stück schreiben. – Drew

+0

Im Fall des "Servers ist weggegangen", ist das ein Problem mit der Verbindungszeitüberschreitung. Der Client (was auch immer das ist, mysql Client-Befehlszeile, Toad, Workbench), weiß auch diesen Status. Es authentifiziert lediglich und führt Befehle durch. Aber beide Seiten sind sich des Zustandes bewusst, keiner wahren Verbindung und die Fäden sind weggeblasen. – Drew

Verwandte Themen