VB.Net SQLClient Connections и SQL Server - активные соединения отражают, хотя все закрытые

Использование VB.Net и SQL Server 2008 R2:

Недавно у меня была база данных, в которой sp_who2 отражает соединение ".Net SqlClient Data Provider" все еще активен, хотя приложение .Net закрыто и удалило все соединения.

Код выглядит так:

Импортирует System.Data.SqlClient

Private Sub TestSQLConnection()

    Dim strConnection As String
    strConnection = "Server=MyServer;UID=User;PWD=Password;Database=MyDatabase"


    Dim conn As New SqlConnection(strConnection)
    conn.Open()

    conn.Close()
    conn.Dispose()

    GC.Collect()
    GC.WaitForPendingFinalizers()

End Sub

И когда я смотрю на SQL Server usng sp_who2 после запуска приложения (посмотрите на полужирный .NetSQLClientDataProvider)

Статус SPID Имя хоста BlkBy DBName Команда CPUTime DiskIO LastBatch Имя программы SPID REQUESTID

57 спит на ВАШЕМ ПК. master КОМАНДА ОЖИДАНИЯ 0 0 07/19 12:38:48 * .Net SqlClient Data Provider * 57 0

Только когда я действительно закрою ПРИЛОЖЕНИЕ, соединение .Net SQLClient Data будет удалено из представления. Меня беспокоит следующее: 1. Какое влияние эти процессы оказывают на мою базу данных с точки зрения ресурсов, и почему соединение отражается и спит. 2. Когда я пытаюсь отсоединить базу данных, я вижу, что 1 соединение активно, но код был закрыт и удален.


person Raphael Segal    schedule 19.07.2011    source источник


Ответы (1)


Это называется пулом подключений. Ожидается, что если вы открыли конкретное соединение, вы, вероятно, захотите снова использовать это соединение в ближайшее время (если, как вы говорите, вы действительно не закроете приложение), поэтому, хотя вы закрываете и / или удаляете объект SqlConnection фактическое сетевое соединение с SQL Server остается открытым за кулисами.

Вы можете указать провайдеру подключения не выполнять объединение в пул, но обычно лучше оставить его включенным. Чтобы отключить его, добавьте Pooling=false в качестве параметра в строка подключения.

Вы также можете принудительно закрыть существующие соединения в пуле. Моя первая ссылка включает эту информацию:

В ADO.NET 2.0 представлены два новых метода очистки пула: ClearAllPools и ClearPool . ClearAllPools очищает пулы соединений для данного провайдера, а ClearPool очищает пул соединений, связанный с определенным соединением. Если во время вызова используются соединения, они помечаются соответствующим образом. Когда они закрываются, они сбрасываются, а не возвращаются в пул.

person Damien_The_Unbeliever    schedule 19.07.2011
comment
@ Smudge202 - значит, вы говорите, что мой ответ неверен? И ваш поиск работает, потому что вы знаете, что искомая фраза - это пул соединений. - person Damien_The_Unbeliever; 19.07.2011
comment
Дэмиен отличный ответ, ты должен быть невероятным и работает как шарм, большое спасибо. Я искал архивы, но не смог собрать его, спасибо большое !! - person Raphael Segal; 19.07.2011
comment
@Damien - я не сказал, что ваш ответ правильный или неправильный. Мы с вами оба знаем, что это связано с пулом соединений. Этот вопрос отличается от других, возможно, только из-за включения sp-who2, поэтому сам вопрос не является точной копией. Но зачем нам нужны копии одного и того же ответа на один и тот же вопрос? Может я не правильно понимаю сайт ... - person Smudge202; 19.07.2011