В программе, над которой я сейчас работаю, я понял, что всякий раз, когда мне нужно получить доступ к SQL Server, я просто набираю queryString и выполняю свой запрос, используя SqlCommand и SqlConnection в C#. В какой-то момент во время программы я даже открыл соединение и выполнил запрос в «цикле for».
Это вредно для программы постоянно открывать-закрывать соединения?
*** Я не очень хорошо знаком с терминологией, поэтому у вас могут возникнуть проблемы с пониманием того, о чем я говорю:
Это очень часто может вызвать какие-либо проблемы?:
string queryString = "Some SQL Query";
public void(){
SqlConnection con = new Connection(conString);
SqlCommand cmd = new SqlCommand(queryString,con);
cmd.Parameters.AddWithValue("@SomeParam",someValue);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
Я использую этот шаблон почти каждый класс, который я создаю (обычно для получения, обновления, вставки данных из/в таблицу данных). Ну разве это вредно?
На самом деле нездоровым является противоположное: попытка удержать одно соединение как можно дольше (или даже сохранить его в глобальном расположении и совместно использовать) приводит к коду, который гораздо сложнее отлаживать и поддерживать. SqlConnection
— это просто дескриптор физического соединения, его открытие стоит дешево. Однако вы должны привыкнуть использовать оператор using
для очистки вещей, а не явный Close
. Кроме того, откажитесь от AddWithValue и научитесь любить Dapper за простые вещи.
Короткий ответ — да — постоянно открывать и закрывать соединения неэффективно. Открытие фактического соединения — очень затратный процесс, а управление соединением в течение всего времени его существования (обычно это время жизни приложения или процесса, его использующего) чревато ошибками.
Вот почему пулы соединений были введены очень давно. Под вашим приложением находится слой, который будет более эффективно управлять физическим открытием/закрытием соединений. Это также помогает предотвратить вероятность того, что открытое соединение будет потеряно и останется открытым (что вызывает множество проблем). По умолчанию пул включен, поэтому вам не нужно ничего делать для его использования.
С объединением — вы пишете код для открытия соединения и используете его на протяжении определенного участка кода, а затем закрываете его. Если в пуле соединений есть открытое, но неиспользуемое соединение, оно будет использоваться повторно, а не открывать новое. Когда вы закрываете соединение, это просто возвращает соединение в пул и делает его доступным для следующей попытки открытия. Вам также следует ознакомиться с оператором c# using.
Итак, теперь, с пулом соединений, не так неэффективно постоянно открывать и закрывать соединения, как раньше? и да, я использую оператор using, пример в моем вопросе был просто для демонстрации.
Хорошей практикой является открытие соединения и его закрытие как можно скорее. Существует пул подключений, которые используются в фоновом режиме (если вы их не отключили).