ASP.NET/ADO.NET: Обрабатываете много соединений с базой данных внутри .NET Object? - PullRequest
3 голосов
/ 02 декабря 2008

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

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 02 декабря 2008

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

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

4 голосов
/ 02 декабря 2008

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

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

2 голосов
/ 02 декабря 2008

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

Так что, да, открывайте и закрывайте соединение по мере необходимости. Однако было бы еще быстрее, если бы вы могли объединять ваши запросы в один вызов exec.

1 голос
/ 19 мая 2009

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

...