2009-06-27 10 views
2

.NETで接続プーリングが使用されていることを読んでいます。.NETのSqlConnection - どのようにして接続プールを最適にすることができますか?

たとえば、同じ接続文字列を持つSqlConnectionオブジェクトをインスタンス化すると、内部的に.NETは同じ接続を使用することを認識します。

これは間違いありませんか?

また、大きなWebベースのアプリケーションでは、この「パワー」を活用する最善の方法についてのヒントはありますか?

答えて

13

WebアプリケーションとSQL Server間のTCP接続をセットアップするのは、コストのかかる操作です。接続プーリングを使用すると、データベースへの接続を後続のデータ要求に再利用できます。各要求で新しいTCP接続を設定するのではなく、新しい接続は接続プールで利用できない場合にのみ設定されます。接続が閉じられると、その接続をデータベースに接続したままプールに戻し、そのTCP接続を完全に切断します。

接続が終了したら、必ず接続を閉じます。 Microsoft .NET Framework内のガベージコレクションについて誰が言っても、接続が終了した時点で常にCloseまたはDisposeを明示的に呼び出してください。共通言語ランタイム(CLR)を信頼して、接続をクリーンアップして閉じないでください。 CLRは最終的にクラスを破棄して接続を強制的に閉じますが、オブジェクトのガベージコレクションが実際に行われるときは保証されません。

接続プーリングを最適に使用するには、いくつかのルールがあります。最初に、接続を開き、作業を行い、接続を閉じます。接続を開いたままで、別の方法でそれを渡すのではなく、各要求に対して複数回接続を開いたり閉じたりすることができます。次に、同じ接続文字列(統合認証を使用している場合は同じスレッドID)を使用します。ログインしたユーザーに基づいて接続文字列をカスタマイズするなど、同じ接続文字列を使用しない場合は、接続プールによって提供される最適化値と同じ値を取得できません。また、多数のユーザーを偽装して統合認証を使用する場合、プーリングも効果が大幅に低下します。

.NET CLRデータパフォーマンスカウンタは、接続プーリングに関連するパフォーマンスの問題を追跡するときに非常に役立ちます。

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

+2

@Robert、すばらしい答えですが、「使用」ステートメントを示すクイックコードの例を追加して、接続を開いて後で廃棄することをおすすめします。 –

2

これは完全に関連しているかどうかわからが、私はちょうどプロジェクトを引き継いだし、元のプログラミングチームは非常に重要な何かをすることができなかった気づいていません。

あなたはのSQLConnectionを持っているとき、のはCONNそれを呼び出すと、あなたがこれをやらせる:

conn.Open(); 

、その後、あなたはそれが選択可能、いくつかのSQL文を実行し、挿入または更新。それが完全に失敗する可能性があります。もちろん、これを行う必要があります:

try { conn.Open() } 
catch (SqlException ex) 
{ 
     //do your logging/exception handling 
} 

ただし、人々はFinallyブロックを追加することを忘れてしまいます。

finally { 
     if (conn.State == System.Data.ConnectionState.Open) 
     conn.Close(); 
} 

接続が開いたままでないという例外がある場合は、必ず閉じてください。

+6

好ましい方法は、connをusing(){}ステートメントに入れることです。プールの有無にかかわらず動作します。 –

+0

は合意しましたが、接続を閉じる前に接続が開いているかどうかを確認したいのはなぜですか?とにかくそれを閉じないでください、私はこれが誤りではないと確信しています。 – SoftwareGeek

+0

あなたは正しいです、それが開いているかどうかをチェックせずにただ閉じることができます。 –

9

次の構文を使用すると、使用ブロックが残っていると例外が発生してもdisposeメソッドが呼び出されます。

using(SqlConnection connection = new SqlConnection()) 
{ 
    // Work with connection object here. 
} 

//connection object gets disposed here. 
関連する問題