web-dev-qa-db-ja.com

常にデータベース接続を閉じるのはなぜですか?

データベースへの接続が大量のリソースを消費する場合、アプリケーションを再度開く必要がある場合、アプリケーションでデータベース接続を常に閉じる必要があるのはなぜですか?この接続をアプリケーション全体でグローバルに利用できるようにして、他のクラスやメソッドが再利用できるようにすることはできますか?

例(擬似コード):

public class PopulateGridViews()
{
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE");
    conn.Open();

    void PopulateGrid1()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid1
    }

    void PopulateGrid2()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid2
    }
}
36
yonan2236

接続を開いたままにしないでください。

以下を行う必要があります:

  1. 可能な限り遅く接続を開く
  2. できるだけ早く接続を閉じる

接続自体は接続プールに返されます。接続は限られた比較的高価なリソースです。同じ接続文字列がexactlyある新しい接続を確立すると、プールからの接続を再利用できます。

接続がプールに戻されるように、使用が終了したら常に接続を閉じることを強くお勧めします。これを行うには、ConnectionオブジェクトのCloseメソッドまたはDisposeメソッドを使用するか、C#のusingステートメントまたはVisual BasicのUsingステートメント内のすべての接続を開きます。明示的に閉じられていない接続は、プールに追加または返されない場合があります。詳細については、「ステートメントの使用(C#リファレンス)」または「方法:Visual Basicのシステムリソースを破棄する」を参照してください。 参照

IDisposableを実装するものはすべて、usingステートメントブロックで適切にラップする必要があります。

 using (SqlConnection connection = new SqlConnection(connectionString))
 {
     connection.Open();

     ...

     command.ExecuteNonQuery();
 }
51
Mitch Wheat

(一部の)データベースは、呼び出し元のアプリから閉じるように指示されるまで接続を開いたままにするためです。データベースへの呼び出しが数百件ある場合、100個の接続が開いた状態でデータベースが占有され、リソースが占有されます。ビジー状態のアプリでデータベースを数千または数十万回呼び出すことは珍しくなく、遅かれ早かれDBのパフォーマンスがアプリのパフォーマンスを低下させます。

それは本当にただの常識です。開いたままにする正当な理由がある場合は、開いてください。そうでない場合は、完了したらすぐに閉じてください。しかし、意図しないときに接続を開いたままにしないように、接続を閉じるという良い習慣を身に付ける方が良いでしょう。食べ物を出していないときにシートベルトを着用したり、冷蔵庫のドアを閉めたりするのは良い習慣です。

この記事では、それが適切であると述べています(少し古くなっていても)。

http://www.bewebmaster.com/84.php

ホスティング会社に共通する問題は、ASPウェブサイトが開かれた後、データベース接続を閉じないことです。これは必須コードの一部であるとみなすべき基本的な手順です。データベース接続を閉じると、Webページのハング、ページの読み込みの遅延など、多くの問題が発生する可能性があります。

それはあなたの家のドアを通り抜けると考えてください。ドアは自然に閉まるかもしれませんが、閉まらないかもしれません。閉じられない場合、誰が何が起こるかを知っています。あなたが田舎に住んでいるなら、熊が入ることができます。あなたが都市に住んでいるなら、強盗が入ることができます。あなたとあなたのホスティング会社の両方にとって多くの不必要な頭痛の種。

10
David

接続を閉じない場合、リソースを継続的に消費し、アプリケーションに全体的な影響を与え、プールに追加または返されない可能性があるため、接続を閉じないことは明らかです。

0