Почему всегда закрывать соединение с базой данных? - PullRequest
36 голосов
/ 06 ноября 2010

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

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

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 ]

50 голосов
/ 06 ноября 2010

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

Вы должны:

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

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

Мы настоятельно рекомендуем вам всегда закройте соединение, когда вы закончил использовать его так, чтобы соединение будет возвращено бассейн. Вы можете сделать это, используя Закрытие или удаление методов Объект подключения или открыв все соединения внутри оператора использования в C # или оператор Using в Visual Основные. Соединения, которые не явно закрытое не может быть добавлено или вернулся в бассейн. Для большего информация, см. с помощью оператора (C # Ссылка) или Как: избавиться от Системный ресурс для Visual Basic. Ref .

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

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

     ...

     command.ExecuteNonQuery();
 }
8 голосов
/ 06 ноября 2010

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

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

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

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

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

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

0 голосов
/ 30 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...