Das zugrunde liegende Protokoll für Datenbankverbindungen basiert in der Regel auf TCP/IP. Die Verbindung kann auf eine von mehreren Arten beendet werden:
- Der Server schließt sie ordnungsgemäß und erhält eine Bestätigung vom Client;
- Der Client wird ordnungsgemäß geschlossen und erhält eine Bestätigung vom Server;
- Die Verbindung wird unterbrochen. Sowohl der Client als auch der Server werden von ihren jeweiligen Betriebssystemen darüber informiert, dass die Verbindung geschlossen wurde;
- 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.