АСП.NET/ADO.NET:Обработка множества подключений к базе данных внутри объекта .NET?

StackOverflow https://stackoverflow.com/questions/334729

Вопрос

У нас есть объект .NET, который выполняет множество операций чтения/записи с базой данных.На протяжении жизненного цикла этого объекта (или страницы asp, которая его использует) он может обращаться к базе данных с запросом/обновлением от 1 до 10 раз.

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

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

Другая альтернатива — открывать и закрывать соединение с базой данных до и после каждого запроса/операции.

Какова наилучшая практика для максимизации производительности?

**** Обновление **** Спасибо за советы, ребята.Может ли кто-нибудь рассказать больше о методе открытия/закрытия соединения внутри событий создания/завершения объекта и о последствиях этого?

Это было полезно?

Решение

Откройте и закройте соединение по мере необходимости.ADO.NET имеет встроенный пул соединений, который работает.Вы не заметите никаких проблем с производительностью, если не будете делать это в цикле с тысячами открытий/закрытий.

редактироватьВидеть Должен ли я сохранять sqlconnection на своем уровне доступа к данным? для получения дополнительной информации о подводных камнях сохранения соединения.

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

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

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

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

Итак, да, открывайте и закрывайте соединение по мере необходимости.Хотя было бы еще быстрее, если бы вы могли группировать запросы в один вызов exec.

Даже если ado.net фактически НЕ закрывает соединение, когда вы это делаете:Conn.Close() выполняет «sp_reset_connection» на сервере, даже если sp_reset_connection является облегченной процедурой хранения, она генерирует некоторый сетевой трафик.Так, например, я бы не рекомендовал закрывать и открывать соединение внутри цикла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top