Является ли чрезмерное использование соединений Sql в С# проблемой?

В программе, над которой я сейчас работаю, я понял, что всякий раз, когда мне нужно получить доступ к 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();

}

Я использую этот шаблон почти каждый класс, который я создаю (обычно для получения, обновления, вставки данных из/в таблицу данных). Ну разве это вредно?

Хорошей практикой является открытие соединения и его закрытие как можно скорее. Существует пул подключений, которые используются в фоновом режиме (если вы их не отключили).

DavidG 14.12.2020 18:01

На самом деле нездоровым является противоположное: попытка удержать одно соединение как можно дольше (или даже сохранить его в глобальном расположении и совместно использовать) приводит к коду, который гораздо сложнее отлаживать и поддерживать. SqlConnection — это просто дескриптор физического соединения, его открытие стоит дешево. Однако вы должны привыкнуть использовать оператор using для очистки вещей, а не явный Close. Кроме того, откажитесь от AddWithValue и научитесь любить Dapper за простые вещи.

Jeroen Mostert 14.12.2020 18:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Короткий ответ — да — постоянно открывать и закрывать соединения неэффективно. Открытие фактического соединения — очень затратный процесс, а управление соединением в течение всего времени его существования (обычно это время жизни приложения или процесса, его использующего) чревато ошибками.

Вот почему пулы соединений были введены очень давно. Под вашим приложением находится слой, который будет более эффективно управлять физическим открытием/закрытием соединений. Это также помогает предотвратить вероятность того, что открытое соединение будет потеряно и останется открытым (что вызывает множество проблем). По умолчанию пул включен, поэтому вам не нужно ничего делать для его использования.

С объединением — вы пишете код для открытия соединения и используете его на протяжении определенного участка кода, а затем закрываете его. Если в пуле соединений есть открытое, но неиспользуемое соединение, оно будет использоваться повторно, а не открывать новое. Когда вы закрываете соединение, это просто возвращает соединение в пул и делает его доступным для следующей попытки открытия. Вам также следует ознакомиться с оператором c# using.

Итак, теперь, с пулом соединений, не так неэффективно постоянно открывать и закрывать соединения, как раньше? и да, я использую оператор using, пример в моем вопросе был просто для демонстрации.

HydraCc 14.12.2020 18:24

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