38

いくつかのメソッドを含む単純な静的クラスがあります。これらの各メソッドは、SqlConnection を開き、データベースにクエリを実行して、接続を閉じます。このようにして、私は常にデータベースへの接続を閉じていると確信していますが、一方で、接続を常に開いたり閉じたりするのは好きではありません。以下は、私のメソッドがどのように見えるかの例です。

public static void AddSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();
        // ...
        connection.Close();
    }
}

メソッドが静的クラス内にあることを考えると、単一の SqlConnection を含む静的メンバーを持つ必要がありますか? いつ、どのようにドロップすればよいですか?ベストプラクティスは何ですか?

4

6 に答える 6

49

いいえ、必要がない限り、静的なままにしないでSqlConnectionください。スレッド化は 1 つの懸念事項ですが、もっと重要なことは、通常はスレッド化する必要がないということです。提示されたコードでは、内部接続プールは、ほとんどの場合、連続する呼び出しで同じ基になる接続を取得することを意味します (同じ接続文字列を使用する限り)。プーラーに仕事をさせてください。コードはそのままにしておきます。

これにより、2 つのスレッドを使い始めたときに何が起こるかという問題も回避されます...それぞれが独自の接続で作業できるようになりました。static を使用すると( を使用しないと仮定して[ThreadStatic])、同期する必要があり、遅延が発生します。再入可能性は言うまでもありません (つまり、単一のスレッドが同じ接続を同時に 2 回使用しようとします)。うん; コードはそのままにしておきます。今は問題ありませんが、ほとんどの変更を加えると、問題が発生する可能性があります。

于 2009-05-14T04:31:00.277 に答える
23

SqlConnection には Open() と Close() を呼び出すときに接続プールがあるため、サーバーへの物理接続を実際に開いたり閉じたりすることはありません。使用可能な接続のプールから接続を追加/削除しているだけです。このため、コマンドの実行後はできるだけ遅く接続を開き、できるだけ早く接続を閉じることをお勧めします。

于 2009-05-14T04:31:06.797 に答える
5

コード サンプルでは、​​接続オブジェクトで close() メソッドを呼び出す必要はありません。これは、コードが using ブロック内に存在するため、自動的に処理されるためです。

于 2009-05-14T04:36:07.783 に答える
3

ほとんどのプログラマーは、遅く開いて早く閉じることを信じています。これが問題になるのは、毎回接続を開いたり閉じたりするための待ち時間によってアプリケーション全体の速度が低下する場合だけです。

静的クラスの場合、毎回接続を開いたり閉じたりするのがおそらく最善です。

于 2009-05-14T04:30:07.720 に答える
1

あなたはベストプラクティスを実践しています。クエリを実行する直前にのみ開き、できるだけ早く閉じます。この種のことは、最初は無駄に思えるかもしれませんが、実際には、長期的にはアプリケーションのスケーラビリティが向上します。

于 2009-05-14T04:30:32.587 に答える
-1

接続自体を閉じることに依存しないでください。明示的に閉じていないと、パフォーマンスの問題が発生します。それは私たちのプロジェクトで起こりました。はい、接続が接続プールによって管理されていることは承知していますが、接続を閉じてプールに戻す必要があります。

于 2010-04-30T02:21:05.747 に答える