5 Stimmen

Datenbank und Verbindungen

Ich möchte wissen, wie Datenbanken mit Verbindungen umgehen, die nicht ausdrücklich von der Entität, die die Verbindung initiiert hat, geschlossen werden.

  1. Angenommen, ich habe eine Datenbank, die nur 2 gleichzeitige Verbindungen gleichzeitig zulässt. Ich habe ein Stück Code, das eine Verbindung öffnet und nie schließt. Dieses Codestück läuft ewig, aber es verwendet die Verbindung nur einmal in seiner Lebenszeit, aber das Verbindungsobjekt geht nie aus dem Anwendungsbereich, so dass es nicht Garbage Collect ist. Angenommen, ich lasse 2 Instanzen dieses Codes laufen. Bedeutet das, dass die Datenbank keine weiteren Verbindungen annehmen kann, bis das Programm beendet wird oder die Verbindung (aufgrund von Inaktivität) abbricht?

  2. In dem obigen Szenario, wenn das Verbindungsobjekt Garbage Collect ist, dann wird die Verbindung automatisch beendet oder hängt es auf den Datenbanktreiber, die ich verwende oder die Verbindung ist nicht überhaupt beendet, bis ich es explizit schließen?

  3. Wenn ich in einem Programmteil eine Verbindung öffne und diese nicht explizit schließe, sondern das Programm beendet wird, wie fordert dann die Datenbank diese Verbindung zurück?

5voto

cletus Punkte 596503

Das zugrunde liegende Protokoll für Datenbankverbindungen basiert in der Regel auf TCP/IP. Die Verbindung kann auf eine von mehreren Arten beendet werden:

  1. Der Server schließt sie ordnungsgemäß und erhält eine Bestätigung vom Client;
  2. Der Client wird ordnungsgemäß geschlossen und erhält eine Bestätigung vom Server;
  3. Die Verbindung wird unterbrochen. Sowohl der Client als auch der Server werden von ihren jeweiligen Betriebssystemen darüber informiert, dass die Verbindung geschlossen wurde;
  4. Die Verbindung wird von beiden Seiten gewaltsam geschlossen.

Im Fall von (3) müssen TCP-Verbindungen am Leben erhalten werden, indem in regelmäßigen Abständen Dummy-Nachrichten gesendet werden, um eine Zeitüberschreitung zu vermeiden. Bei Ihrer Verbindung kann es zu einer Zeitüberschreitung kommen, weil keine der beiden Seiten dies tut (und bei einer Datenbankverbindung ist dies in der Regel auch nicht erwünscht).

Es kann durchaus vorkommen, dass eine Seite denkt, die Verbindung sei geschlossen, und die andere Seite glaubt, sie sei noch offen. In diesen Fällen werden möglicherweise Nachrichten gesendet (und normalerweise verworfen).

Jede Verbindung ("Socket") verwendet eine Betriebssystemressource namens Dateideskriptor (in der UNIX-Sprache, Ihr Betriebssystem kann es anders nennen), was ein Handle zu einer E/A-Ressource und dasselbe ist, was für eine offene Datei verwendet wird (auch hier können Betriebssysteme variieren).

Das Limit für Verbindungen auf Ihrer Datenbank ist das niedrigste von:

  • Der konfigurierte Grenzwert für das Betriebssystem;
  • die für diesen Prozess maximal zulässigen Dateideskriptoren (abzüglich derjenigen, die für E/A-Aktivitäten verwendet werden); und
  • (möglicherweise) Systemeinstellungen oder Richtlinien für Verbindungsgrenzen.

Wenn die Verbindung nicht auf TCP basiert (z. B. ein Dateisystem-Socket, wie er oft mit MySQL auf UNIX-Systemen verwendet wird), sind die Prinzipien eigentlich sehr ähnlich.

Wie auch immer, die Moral von der Geschichte ist, dass eine Datenbankverbindung - unabhängig von ihrer Form - eine Betriebssystemressource irgendeiner Art beinhaltet. Ihr Programm hat direkt oder indirekt nach dieser Ressource gefragt. Wenn das Programm stirbt, wird das Betriebssystem sie zurückfordern (vielleicht nicht sofort, aber irgendwann). Wenn die Verbindung in die Müllabfuhr geht, wird die Ressource auf die gleiche Weise freigegeben, wie wenn sie gewaltsam geschlossen worden wäre.

Es ist diese externe Ressource (und nicht der Code, den Ihr Client verwendet), die die Verbindung offen hält und alle Grenzen setzt.

4voto

derobert Punkte 47691

Um Ihre Fragen der Reihe nach zu beantworten:

  1. Ja, wahrscheinlich. Es sei denn, Sie meinen mit "gleichzeitigen Verbindungen" tatsächlich "gleichzeitige Abfragen". Wenn Sie die Datenbankverbindung offen halten, ist sie offen.

  2. Die Garbage Collection kann die Verbindung bereinigen, muss es aber nicht. Dies hängt von der Sprache und dem verwendeten Datenbanktreiber ab. (Die Garbage Collection kann sich auf die Rückgewinnung von Speicher beschränken, nicht auf Ressourcen wie TCP-Verbindungen).

  3. Wenn Ihr Programm beendet wird, ist in der Regel das Betriebssystem für das Aufräumen aller verwendeten Ressourcen verantwortlich. Dazu gehört auch das Schließen von TCP- usw. Verbindungen. Bei den meisten Verbindungstypen wird die Datenbank also benachrichtigt, dass die andere Seite die Verbindung geschlossen hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X