АСП.NET/ADO.NET:Обработка множества подключений к базе данных внутри объекта .NET?
-
22-07-2019 - |
Вопрос
У нас есть объект .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 является облегченной процедурой хранения, она генерирует некоторый сетевой трафик.Так, например, я бы не рекомендовал закрывать и открывать соединение внутри цикла.