Подтвердить что ты не робот

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

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

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

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
    }
}
4b9b3361

Ответ 1

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

Вы должны:

1) Открытые соединения как можно позже

2) Закрыть соединения как можно скорее

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

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

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

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

     ...

     command.ExecuteNonQuery();
 }

Ответ 2

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

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

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

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

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

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