2010-06-12 4 views

ответ

3

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

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

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

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

0

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

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

+0

@ должен ли я просто хранить объект кешированного соединения – leora

0

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

try-finally

+2

Или использовать оператор 'using' –

0

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

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

Джима

1

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

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

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

Смежные вопросы