データベース接続の基礎となるプロトコルは、通常、TCP/IP ベースです。接続は、いくつかの方法のいずれかで終了できます。
- サーバーはそれを正常に閉じ、クライアントから確認を受け取ります。
- クライアントは正常に終了し、サーバーから確認を受け取ります。
- 接続がタイムアウトします。クライアントとサーバーの両方は、接続が閉じられたことをそれぞれのオペレーティング システムから個別に通知されます。
- 接続はいずれかの側で強制的に閉じられます。
(3) の場合、タイムアウトを回避するために、時々ダミー メッセージを送信して TCP 接続を維持する必要があります。どちらの側もこれを行っていないため、接続がタイムアウトする可能性があります (データベース接続の場合、これは通常やりたいことではありません)。
一方が接続が閉じていると考え、もう一方が接続が開いていると考える可能性は十分にあります。このような場合、メッセージが送信されることがあります (通常は破棄されます)。
各接続 (「ソケット」) は、ファイル記述子と呼ばれるオペレーティング システム リソースを使用します(UNIX の用語では、OS はそれを別の名前で呼ぶ場合があります)。これは、I/O リソースへのハンドルであり、開いているファイル (繰り返しますが、OS は異なる場合があります)。
データベースの接続制限は、次のうち最も低いものになります。
- OS に構成された制限。
- そのプロセスに許可されているファイル記述子の最大数 (I/O アクティビティに使用されているものを除く)。と
- (おそらく) 接続制限に関するシステム設定またはポリシー。
接続が TCP ベースでない場合 (たとえば、UNIX システム上の MySQL でよく使用されるファイルシステム ソケット)、原理は実際には非常に似ています。
いずれにせよ、この話から得られる教訓は、データベース接続は、その形式に関係なく、ある種のオペレーティング システム リソースを必要とするということです。あなたのプログラムは直接的または間接的にそのリソースを要求しました。プログラムが停止した場合、オペレーティング システムはそれを再利用します (おそらくすぐではなく、最終的に)。接続がガベージ コレクションされると、強制的に閉じられた場合とほぼ同じ方法でリソースが解放されます。
その外部リソース (クライアントが使用しているコードではない) は、接続を開いたままにし、制限を駆動します。