質問
接続を開始したエンティティによって明示的に閉じられていない接続をデータベースがどのように処理するかを知りたい。
-
一度に2つの同時接続のみを受け入れることができるデータベースがあるとします。接続を開き、決して閉じないコードがあります。このコードは永久に実行されますが、そのライフタイム内に1回だけ接続を使用しますが、接続オブジェクトがスコープ外になることはないため、ガベージコレクションされません。このコードの2つのインスタンスを実行するとします。プログラムが終了するか、接続がタイムアウト(非アクティブになったため)になるまで、データベースはこれ以上接続を受け入れられないということですか?
-
上記のシナリオで、接続オブジェクトがガベージコレクションされる場合、接続は自動的に終了しますか、使用しているデータベースドライバーに依存するか、明示的に閉じるまで接続がまったく終了しませんか?
-
コードの一部で接続を開き、接続を明示的に閉じないが、プログラムが終了した場合、データベースはその接続をどのように再利用しますか?
解決
データベース接続の基礎となるプロトコルは、通常TCP / IPベースです。接続は、次のいずれかの方法で終了できます。
- サーバーはサーバーを正常に閉じ、クライアントから確認応答を受け取ります。
- クライアントのクローズは正常に行われ、サーバーから確認応答を受け取ります。
- 接続がタイムアウトします。クライアントとサーバーは別々に、それぞれのオペレーティングシステムから接続が閉じられたことが通知されます。
- 接続は両側で強制的に閉じられます。
(3)の場合、タイムアウトを回避するためにダミーメッセージを頻繁に送信することにより、TCP接続を維持する必要があります。どちらの側もこれを行っていないため、接続がタイムアウトする可能性があります(また、データベース接続の場合、通常は行いたくないことです)。
一方の側が接続が閉じていると考え、もう一方の側がまだ開いていると信じることは完全に可能です。そのような場合、メッセージが送信される可能性があります(通常は破棄されます)。
各接続(<!> quot; socket <!> quot;)は、ファイル記述子と呼ばれるオペレーティングシステムリソースを使用します(UNIXの用語では、OSは別の名前を付けることがあります)。 I / Oリソースへのハンドルと開いているファイルに使用されるものと同じもの(ここでも、OSは異なる場合があります)。
データベース上の接続の制限は、次のうち最も低いものになります。
- OSに設定された制限;
- そのプロセスに許可されている最大ファイル記述子(I / Oアクティビティに使用されているものを除く)。そして
- (おそらく)接続制限に関するシステム設定またはポリシー。
接続がTCPベースでない場合(たとえば、UNIXシステムのMySQLでよく使用されるファイルシステムソケット)、原則は実際非常に似ています。
とにかく、これから得られるストーリーの教訓は、データベース接続は、その形式に関係なく、何らかのオペレーティングシステムリソースを含むということです。プログラムhsaは、直接または間接的にそのリソースを要求しました。プログラムが停止すると、オペレーティングシステムはそれを回収します(おそらくすぐではなく、最終的に)。接続がガベージコレクションされると、リソースは強制的に閉じられた場合とほぼ同じ方法で解放されます。
接続を開いたままにして制限をかける外部リソース(クライアントが使用しているコードではない)です。
他のヒント
質問に順番に回答するには:
-
はい、おそらく。 <!> quot;同時接続<!> quot;実際には<!> quot;同時クエリ<!> quot;を意味します。データベース接続を開いたままにしている場合は、開いています。
-
ガベージコレクションは、接続をクリーンアップする場合としない場合があります。使用する言語とデータベースドライバーに依存します。 (ガベージコレクションは、TCP接続などのリソースではなく、メモリの再利用に制限される場合があります。)
-
プログラムが終了すると、通常、OSは使用したすべてのリソースをクリーンアップします。これには、TCPなどの接続の終了が含まれます。そのため、ほとんどの接続タイプでは、相手側が接続を閉じたことがデータベースに通知されます。