2009-08-13 2 views
0

установки:ADO.NET Пулы соединений и последствия для AutoClose = True

Я создаю приложения .NET WinForms в C#, чтобы наши люди технической поддержки легко выполнять общие задачи в отношении нашего продукта SQL Server базы данных 2005. Приложение использует ADO.NET (SqlConnection) для подключения к базе данных. Одной из проблем при разработке этого приложения было минимизировать накладные расходы на подключение/повторное подключение к базе данных каждый раз, когда инициируется задача (запрос). Основная причина этих издержек, по моему мнению, связана с базой данных, имеющей свойство AutoClose, равное «True». Я бы хотел изменить это, но, к сожалению, это не под моим контролем. Я также знаю, что создание соединения с базой данных связано с некоторыми непредвиденными расходами. У меня была рабочая реализация приложения, поддерживавшего единое соединение (если только оно не было закрыто раньше) через жизненный цикл приложения. Затем я наткнулся на статью MSDN по адресу connection pooling in ADO.NET.

После прочтения статьи (и другие вопросы/ответы here, here и here) оказывается, что ADO.NET пул соединений будет поддерживать соединение с базой данных, даже если мое приложение правильно утилизировать его SqlConnection объекта. Соединение будет сохранено в пуле и будет повторно использоваться до тех пор, пока оно не будет работать в течение определенного периода времени или в противном случае будет нарушено. Таким образом, моя работа по поддержанию единственного соединения в приложении кажется ненужной и, безусловно, более опасной, чем просто создание/удаление SqlConnection каждый раз, когда это необходимо.

Вопросы:

  1. Какие последствия присутствуют при использовании ADO.NET Пулы соединений с базой данных SQL Server, с "AutoClose" установлено значение "истина"?

  2. Я понимаю, что я могу упростить, когда я описываю, как я считаю, что объединение пулов работает за кулисами, но в стороне, насколько я понимаю? Если нет, то где это необходимо для коррекции?

ответ

2

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

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

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

+0

Я полностью согласен с тем, что AutoClose следует отключить. К сожалению, у меня нет контроля или влияния в отношении этого решения. – dcharles

+0

Что я буду делать, а не полагаться на объединение недоходного поведения (то есть, что такое * текущая база данных при удалении соединения в пул), я бы открывал очень явное соединение в приложении, исключительно для этой цели , При этом, кто имеет «влияние и контроль», он может заметить, что кто-то держит свою дорогую базу данных открытой и придет после вас с вилкой и факелом. –

+0

Спасибо за помощь! – dcharles

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