Какова оптимальная стратегия подключения к базе данных - PullRequest
0 голосов
/ 12 июня 2010

У меня есть веб-сайт asp.net mvc, который выполняет несколько запросов для каждой страницы.Должен ли я открывать одно соединение или открывать и закрывать соединение по каждому запросу?

Ответы [ 5 ]

3 голосов
/ 12 июня 2010

Это действительно не имеет значения.Когда вы используете ADO.NET (который включает в себя Linq to SQL, NHibernate и любые другие ORM), библиотека использует пул соединений.Вы можете «закрыть» и «вновь открыть» логическое соединение дюжину раз, но одно и то же физическое соединение останется открытым все время.Так что не слишком заботьтесь о том, открыто или закрыто соединение.

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

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

Итог: забудьте о стратегии подключения и начните беспокоиться о стратегии запроса.Более 3-5 запросов на страницу, и вы можете столкнуться с серьезными проблемами масштаба.

1 голос
/ 13 июня 2010

Если вы выполняете несколько запросов на странице в обычном ADO.NET, то они выполняются последовательно и пул соединений будет означать, что это не имеет значения. Рекомендуется открывать соединения по требованию и немедленно их закрывать - даже для нескольких запросов на одной странице. Пул соединений делает это довольно эффективным.

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

Существует также возможность использовать MARS для одного соединения, но я не большой сторонник этого, и он намного более ограничен в функциональности.

0 голосов
/ 12 июня 2010

Чтобы избежать ненужных накладных расходов, лучше использовать одно соединение. Но обязательно выполняйте запросы в блоке try и закрывайте соединения в блоке finally, чтобы не повредить соединения.

примерка наконец

0 голосов
/ 12 июня 2010

UnitOfWork ??Это отличная стратегия для использования.nhibernate и многие другие используют этот шаблон.

дайте ему Google для конкретных деталей, относящихся к вашим потребностям ..

jim

0 голосов
/ 12 июня 2010

Если вы уверены, что транзакции быстро завершатся, используйте одно соединение.

Не забудьте проверить все возвращаемые результаты и обернуть все в обработку исключений, где это возможно.

...