VB.Net SQLClient连接和SQL Server - 活动连接即使全部关闭也会反映出来

时间:2011-07-19 11:06:50

标签: sql-server vb.net sqlconnection sp-who2

使用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状态登录HostName BlkBy DBName命令CPUTime DiskIO LastBatch ProgramName SPID REQUESTID

57睡觉你的电脑。 master AWAITING COMMAND 0 0 07/19 12:38:48 * .Net SqlClient数据提供者 * 57 0

只有在我实际关闭APPLICATION时才会从视图中删除.Net SQLClient数据连接。 我关心的是以下内容: 1.从资源的角度来看,这些过程对我的数据库有什么影响,为什么连接会反映和睡眠。 2.当我尝试分离数据库时,我认为1个连接处于活动状态,但代码已关闭并处理掉。

1 个答案:

答案 0 :(得分:3)

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

您可以指示连接提供程序不执行连接池,但保持启用通常是一件好事。要将其停用,请在connection string中添加SqlConnection作为选项。

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

  

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