2013-03-21 14 views
8

私はこの質問に対して矛盾する結果を見つけ続けています。のは、SQLクエリを実行し、このC#のコードを見てみましょう:usingキーワードでSQL Server接続を閉じる必要がありますか?

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    cn.Open(); 

    using (SqlCommand cmd = new SqlCommand(strSQL, cn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 

    //Do I need to call? 
    cn.Close(); 
} 

が、私はその最後のcn.Close()を呼び出す必要がありますか?私が求めている理由は、大量のトラフィックWebアプリケーションでプール内の接続が不足していることです。

答えて

10

ここで使用されるようにusingキーワードは:どの順番ですぐに、

SqlConnection cn = null; 
try 
{ 
    cn = new SqlConnection(strConnectString); 
    // Stuff 
} 
finally 
{ 
    if (cn != null) cn.Dispose(); 
} 

cn.Dispose()はすぐcnと呼ばusingの範囲の外に出ることになります。

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

ために短いです(SqlConnection.Dispose()はそれだけを行うため)接続を閉じます。

UPDATE

これは、ガベージコレクションと混同してはなりません。 GCは非決定論的です。正確になぜIDisposable intefaceとDispose Patternが導入されたのかということです。 IDisposableは、タイムリーかつ決定論的な方法で高価なリソースを解放することができます。

1

Usingステートメントを使用するときに接続を閉じる必要はありません。

Scott hanselmanはここでそれを説明しますWhy The Using Statement Is Better Than A Sharp Stick In The Eye And A SqlConnection Refactoring Example

トラフィックの多いウェブアプリでは、プール内の接続が不足しています。

このように同じ接続文字列を使用していることを確認して、SQLは接続プーリングを使用します。

接続が直ちに閉じている、またはそれがガベージ コレクタがそれに到達したときに閉じている

編集:

廃棄パターンは、リソースの決定論的破壊を提供するために使用されます。 .NETランタイムガベージコレクタは非決定的です(つまり、実行時に古いオブジェクトを収集してファイナライザを呼び出すことは決してできません)。したがって、Disposeパターンを適切に実装すると、リソースの確定的なリリースが提供されます。消費者が不注意であり、オブジェクトを破棄しない場合、ファイナライザはオブジェクトをクリーンアップします。

+0

ありがとうございました。問題は - 接続がすぐに閉じられるか、またはガベージコレクタが接続されると閉じられるかどうかです。それは私の場合に違いを生むからです。 – c00000fd

+0

"同じ接続文字列を使用していることを確認してください" - それはどういう意味ですか? 'SqlConnection cn'を静的変数として定義しますか? – c00000fd

+1

'それは不確定ファイナライゼーション' = **間違った**です。接続は 'using'ステートメントの範囲外に出た直後に処理されます。それはガベージコレクションとは関係ありません。実際、非決定論的なGCは、IDisposableインターフェイスとDispose Patternが.NETに導入された理由です。 –

1

usingを内部で使用している場合は、Displose()を呼び出して閉じる必要はありません。

ここでは、ADO.NETのキーワードusingについて詳しく説明します。

Leveraging the "using" keyword in C#

クイック検索@SOは、あなたがあまりにもそこにあなたの答えを見つけることができますthis postにあなたを導くでしょう。

関連する問題