5

接続を開始したエンティティによって明示的に閉じられていない接続をデータベースがどのように処理するかを知りたいです。

  1. 一度に 2 つの同時接続のみを受け入れることができるデータベースがあるとします。接続を開き、決して閉じないコードがあります。このコードは永久に実行されますが、接続は有効期間内に 1 回しか使用されませんが、接続オブジェクトが範囲外になることはないため、ガベージ コレクションは行われません。このコードの 2 つのインスタンスを実行するとします。プログラムが終了するか、接続がタイムアウトするまで (非アクティブなために)、データベースはそれ以上の接続を受け入れられないということですか?

  2. 上記のシナリオで、接続オブジェクトがガベージ コレクションされている場合、接続は自動的に終了しますか、それとも使用しているデータベース ドライバーに依存しますか、それとも明示的に閉じるまで接続はまったく終了しませんか?

  3. コードの一部で接続を開き、接続を明示的に閉じていないのにプログラムが終了した場合、データベースはその接続をどのように回収しますか?

4

2 に答える 2

5

データベース接続の基礎となるプロトコルは、通常、TCP/IP ベースです。接続は、いくつかの方法のいずれかで終了できます。

  1. サーバーはそれを正常に閉じ、クライアントから確認を受け取ります。
  2. クライアントは正常に終了し、サーバーから確認を受け取ります。
  3. 接続がタイムアウトします。クライアントとサーバーの両方は、接続が閉じられたことをそれぞれのオペレーティング システムから個別に通知されます。
  4. 接続はいずれかの側で強制的に閉じられます。

(3) の場合、タイムアウトを回避するために、時々ダミー メッセージを送信して TCP 接続を維持する必要があります。どちらの側もこれを行っていないため、接続がタイムアウトする可能性があります (データベース接続の場合、これは通常やりたいことではありません)。

一方が接続が閉じていると考え、もう一方が接続が開いていると考える可能性は十分にあります。このような場合、メッセージが送信されることがあります (通常は破棄されます)。

各接続 (「ソケット」) は、ファイル記述子と呼ばれるオペレーティング システム リソースを使用します(UNIX の用語では、OS はそれを別の名前で呼ぶ場合があります)。これは、I/O リソースへのハンドルであり、開いているファイル (繰り返しますが、OS は異なる場合があります)。

データベースの接続制限は、次のうち最も低いものになります。

  • OS に構成された制限。
  • そのプロセスに許可されているファイル記述子の最大数 (I/O アクティビティに使用されているものを除く)。と
  • (おそらく) 接続制限に関するシステム設定またはポリシー。

接続が TCP ベースでない場合 (たとえば、UNIX システム上の MySQL でよく使用されるファイルシステム ソケット)、原理は実際には非常に似ています。

いずれにせよ、この話から得られる教訓は、データベース接続は、その形式に関係なく、ある種のオペレーティング システム リソースを必要とするということです。あなたのプログラムは直接的または間接的にそのリソースを要求しました。プログラムが停止した場合、オペレーティング システムはそれを再利用します (おそらくすぐではなく、最終的に)。接続がガベージ コレクションされると、強制的に閉じられた場合とほぼ同じ方法でリソースが解放されます。

その外部リソース (クライアントが使用しているコードではない) は、接続を開いたままにし、制限を駆動します。

于 2009-01-16T05:50:20.580 に答える
4

質問に順番に答えるには:

  1. はい、たぶん。「同時接続」が実際に「同時クエリ」を意味しない限り。データベース接続を開いたままにしている場合は、開いています。

  2. ガベージ コレクションによって、接続がクリーンアップされる場合とクリーンアップされない場合があります。使用する言語とデータベース ドライバによって異なります。(ガベージ コレクションは、TCP 接続などのリソースではなく、メモリの再利用に限定される場合があります。)

  3. プログラムが終了すると、通常、OS はそれが使用したすべてのリソースをクリーンアップする責任があります。これには、TCP などの接続を閉じることも含まれます。そのため、ほとんどの接続タイプでは、相手側が接続を閉じたことがデータベースに通知されます。

于 2009-01-16T05:49:10.627 に答える