VB.Net SQLClient Connections и SQL Server - активные соединения отражаются, даже если все закрыты - PullRequest
1 голос
/ 19 июля 2011

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

У меня недавно была база данных, в которой использование sp_who2 отражает соединение. «Поставщик данных .Net SqlClient» по-прежнему активен, хотя приложение .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 AWAITING COMMAND 0 0 07/19 12:38:48 * .Net SqlClient Data Provider * 57 0

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

1 Ответ

3 голосов
/ 19 июля 2011

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

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

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

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

...