Нужно ли закрывать соединение SQL Server с помощью ключевого слова using?

Я продолжаю находить противоречивые результаты для этого вопроса. Давайте посмотрим на этот код C# для выполнения SQL-запроса:

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()? Я спрашиваю, что в тяжелый трафик веб-приложения я запускать из соединений в пуле.

3 ответов


на 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() будет называться тут после cn выходит за рамки using, который, в свою очередь, немедленно закрывает соединение (потому что SqlConnection.Метод Dispose() делает именно это).

обновление

это не следует путать со сборкой мусора. GC недетерминирован в .NET, именно поэтому IDisposable inteface и Dispose Pattern. IDisposable позволяет своевременно и детерминированно высвобождать дорогостоящие ресурсы.


нет необходимости закрывать его, если вы используете using как он называет Displose() внутренне.

вот немного подробнее о using ключевое слово в ADO.NET может, стоит почитать.

использование ключевого слова "using" в C#

быстрый поиск @SO приведет вас к этот пост, где вы можете найти свои ответы там тоже.


вам не нужно закрывать соединение при использовании Using заявление.

Скотт Хансельман объясняет это здесь Почему Оператор Using Лучше, Чем Острая Палка В Глазу И Пример Рефакторинга SqlConnection.

в веб-приложении с интенсивным трафиком у меня заканчиваются соединения в пуле.

убедитесь, что вы используете ту же строку подключения, таким образом SQL будет использовать пул соединений.

is соединение закрыто немедленно, или оно закрыто, когда мусор коллекционер добирается до него

Edit:

шаблон Dispose используется для обеспечения детерминированного уничтожения ресурсов. Поскольку сборщик мусора .net runtime является недетерминированным (что означает, что вы никогда не можете быть уверены, когда среда выполнения будет собирать старые объекты и вызывать их финализатор). Поэтому при правильной реализации шаблона Dispose вы предоставляете детерминированный выпуск из ресурсов и в случаях, когда потребитель неосторожен и не распоряжается объектом, финализатор очистит объект.