1

使用 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 使用 sp_who2 时(查看粗体的 .NetSQLClientDataProvider)

SPID 状态 Login HostName BlkBy DBName Command CPUTime DiskIO LastBatch ProgramName SPID REQUESTID

57 睡着你的电脑。主等待命令 0 0 07/19 12:38:48 * .Net SqlClient 数据提供者* 57 0

只有当我真正关闭应用程序时,.Net SQLClient 数据连接才会从视图中删除。我关心的是以下几点: 1. 从资源的角度来看,这些进程对我的数据库有什么影响,为什么连接会被反射和休眠。2. 当我尝试分离数据库时,我发现 1 个连接处于活动状态,但代码已关闭并处理。

4

1 回答 1

3

它被称为连接池。期望是,如果您打开了一个特定的连接,您可能希望很快再次使用该连接(除非,正如您所说,您实际上关闭了应用程序),所以尽管您关闭和/或处置该SqlConnection对象,到 SQL Server 的实际网络连接在幕后保持打开状态。

您可以指示连接提供者不执行连接池,但保持启用通常是件好事。要禁用它,请在连接字符串Pooling=false中添加一个选项。

您还可以强制关闭池中的现有连接。我的第一个链接包含以下信息:

ADO.NET 2.0 引入了两种清除池的新方法:ClearAllPoolsClearPool。ClearAllPools 清除给定提供程序的连接池,ClearPool 清除与特定连接关联的连接池。如果在调用时有正在使用的连接,它们会被适当地标记。当它们关闭时,它们被丢弃而不是返回到池中。

于 2011-07-19T11:55:15.810 回答