使用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个连接处于活动状态,但代码已关闭并处理掉。
答案 0 :(得分:3)
它被称为Connection Pooling。期望是如果你打开了一个特定的连接,你可能希望很快再次使用该连接(除非,正如你所说,你实际上关闭了应用程序),所以尽管你关闭和/或处置{{ 1}}对象,与SQL Server的实际网络连接在后台保持打开状态。
您可以指示连接提供程序不执行连接池,但保持启用通常是一件好事。要将其停用,请在connection string中添加SqlConnection
作为选项。
您还可以强制在池中关闭现有连接。我的第一个链接包含以下信息:
ADO.NET 2.0引入了两种清除池的新方法:ClearAllPools和ClearPool。 ClearAllPools清除给定提供程序的连接池,ClearPool清除与特定连接关联的连接池。如果在呼叫时使用了连接,则会对它们进行适当标记。当它们关闭时,它们会被丢弃而不是返回池中。