9

私はこの質問に対して相反する結果を見つけ続けています。SQLクエリを実行するこのC#コードを見てみましょう。

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アプリでは、プール内の接続が不足しているためです。

4

3 に答える 3

11

ここusingで使用されるキーワード:

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

の略です:

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

cn.Dispose()のスコープ外に出た直後に呼び出され、すぐに接続を閉じます (SqlConnection.Dispose() がそれを行うため)。cnusing

アップデート

これをガベージ コレクションと混同しないでください。GC は .NET では非決定論的です。これがまさに、IDisposableインターフェイスとDispose パターンが導入された理由です。 IDisposableを使用すると、高価なリソースをタイムリーで決定論的な方法で解放できます。

于 2013-03-21T02:38:21.243 に答える
1

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

スコット・ハンゼルマンはここでそれを説明します。なぜ使用ステートメントが目の鋭い棒とSqlConnectionリファクタリングの例よりも優れているのか。

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

この方法で同じ接続文字列を使用していることを確認してください。SQLは接続プールを使用します。

接続はすぐに閉じられますか、それともガベージコレクターが接続に到達したときに閉じられますか

編集:

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

于 2013-03-21T02:32:04.563 に答える
1

内部using呼び出しのまま使用する場合は閉じる必要はありません。Displose()

ここでは、ADO.NET のキーワードについて少し詳しく説明しusingます。読む価値があるかもしれません。

C# での「using」キーワードの活用

@SO をすばやく検索すると、この投稿に移動し、そこでも回答を見つけることができます。

于 2013-03-21T02:37:22.957 に答える