Почему всегда закрывать соединение с базой данных?

Если подключение к базе данных требует много ресурсов, почему подключение к базе данных всегда должно быть закрыто в вашем приложении, если вам нужно открыть его снова? Могу ли я просто сделать это соединение доступным глобально во всем приложении, чтобы другие классы и методы могли использовать его повторно?

Например (в псевдокоде):

public class PopulateGridViews()
{
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE");
    conn.Open();

    void PopulateGrid1()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid1
    }

    void PopulateGrid2()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid2
    }
}

3 ответа

Решение

Вы не должны оставлять соединения открытыми.

Вам следует:

  1. Открывайте соединения как можно позже
  2. Закрыть соединения как можно скорее

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

Мы настоятельно рекомендуем всегда закрывать соединение по окончании его использования, чтобы соединение было возвращено в пул. Это можно сделать, используя методы Close или Dispose объекта Connection, или открыв все соединения внутри оператора using в C# или оператора Using в Visual Basic. Соединения, которые явно не закрыты, могут не быть добавлены или возвращены в пул. Для получения дополнительной информации см. Использование Statement (C# Reference) или Как: Утилизировать системный ресурс для Visual Basic. Ссылка

Вы должны соответствующим образом обернуть все, что реализует IDisposable в using Блок выписки:

 using (SqlConnection connection = new SqlConnection(connectionString))
 {
     connection.Open();

     ...

     command.ExecuteNonQuery();
 }

Поскольку (некоторые) базы данных также удерживают открытым соединение, пока вызывающее приложение не сообщит о его закрытии. Если вы получаете сотни звонков в базу данных, то она сидит там со 100 открытыми соединениями, связывающими ресурсы. Нередко тысячи или сотни тысяч обращений к базе данных в загруженном приложении, и рано или поздно производительность базы данных убьет производительность приложения.

Это действительно просто здравый смысл. Если у вас есть веская причина, чтобы оставить его открытым, сделайте это. Если нет, закройте его, как только закончите. Но лучше иметь привычку закрывать соединения, чтобы вы не оставляли их открытыми, когда не собираетесь этого делать. Это хорошая привычка, например, пристегнуть ремень безопасности или закрыть дверь холодильника, когда вы не достаете еду.

В этой статье это хорошо сказано (даже если оно немного устарело):

http://www.bewebmaster.com/84.php

Распространенной проблемой среди хостинговых компаний является то, что веб-сайты ASP не закрывают соединения с базой данных после их открытия. Это основной шаг, который вы должны рассматривать как часть обязательного кода. Если вы не закроете соединения с базой данных, может возникнуть много проблем, таких как зависание веб-страниц, медленная загрузка страниц и многое другое.

Думайте об этом как о прохождении двери вашего дома. Может быть, дверь сама закроется, а может и нет. Если он не закроется, кто знает, что произойдет. Если вы живете в стране, может зайти медведь. Если вы живете в городе, может зайти грабитель. Хорошо, может быть, если оставить соединение с базой данных открытым, это не приведет ни к чему плохому, но это приведет к много ненужных головных болей как для вас, так и для вашей хостинговой компании.

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

Другие вопросы по тегам