Entity framework 4 не закрывает соединение в профилировщике sql server 2005

Я впервые использую Entity Framework 4 в приложении ASP.net. Я хотел убедиться, что соединения с БД закрываются после выхода из инструкции использования, однако в профилировщике SQL Server 2005 я не вижу выхода из соединения при выходе из использования, только логин при входе в него,

Например, я начал с пустой страницы asp.net и в Page_Load попробовал использовать этот простой код (и абсолютно ничего другого на странице):

using (var model = new DB("name=DB"))
{
  var livre = (from l in model.books
           select l).SingleOrDefault();
}

В профайлере я вижу логин аудита, но не выход после выхода из "использования". Поэтому я попытался закрыть соединение явно, используя следующий код:

using (var model = new DB("name=DB"))
{  
  var livre = (from l in model.books
           select l).SingleOrDefault();
  model.Connection.Close();
}

Опять же, я вижу логин, но не выход. Странно то, что когда я проверяю свойство ConnectionState в model.Connection после закрытия, оно указывает «Закрыто», но не на сервере Sql.

Чтобы увидеть фактический выход из системы в SQL Server, мне нужно нажать кнопку «Остановить отладку» в VS2010, и когда я перезапускаю веб-приложение, только тогда я вижу выход из системы (после фактического входа в систему, когда моя страница обрабатывается).

Я начинаю задаваться вопросом, есть ли что-то в SQL Server, что может держать соединение открытым, даже если оно закрыто в коде.

Любая идея?

Спасибо


person user1185417    schedule 02.02.2012    source источник
comment
Это предполагаемое поведение. Прочтите об повторном использовании/объединении соединений.   -  person Oleg Dok    schedule 02.02.2012
comment
Я подозреваю, что вы видите пул соединений в действии. Где пул поддерживает соединение, чтобы его можно было быстро повторно использовать для следующего запроса.   -  person EBarr    schedule 02.02.2012
comment
Добавьте: Pooling=false в строку подключения sql, но помните о последствиях для производительности.   -  person Tomek    schedule 02.02.2012


Ответы (1)


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

person Paul Taylor    schedule 20.12.2012