这可能是我的误解,但我确实有很大的问题。请考虑以下代码:
static void Main(string[] args)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
int i = 10;
con.Close();
con.Dispose();
}
int y = 10;
}
在第int y = 10
行,放置一个断点。
现在,转到您的SQL Server并右键单击SQl Connection,它与上面代码中的connectionString
连接相同,然后选择“Activity Monitor”。运行上面的代码并检查SQL Server活动监视器。执行con.Open()
时,活动监视器会显示已建立连接。到现在为止还挺好!但是当光标到达指示int y = 10;
的行时,活动监视器仍会显示不应存在的连接!因为我关闭它,我处理它,甚至我也通过了使用声明。
有谁知道如何关闭连接?
答案 0 :(得分:8)
这是连接池,正确地完成了它的工作。几乎在所有情况下,这都是好事。如果您不想这样:通过连接字符串禁用连接池。
基本上,您需要保留单独的2个概念:
SqlConnection
托管连接实例在正常使用情况下,关闭或部署托管连接只会将非托管连接放回池中,以备快速使用。如果希望托管和非托管连接一起消亡,则必须禁用连接池。
答案 1 :(得分:4)
默认情况下,汇集.NET中的数据库连接。这意味着虽然连接的单个实例(SqlConnection
)已关闭,但框架实际上将保持底层实际连接以允许更快地创建新连接。除非你有充分的理由,否则你可能不想乱用它,因为它确实会给你带来良好的性能提升。
话虽这么说,你实际上可以强制池关闭它仍然拥有的所有连接。您可以使用SqlConnection.ClearPool
执行此操作,或者使用更大的锤子SqlConnection.ClearAllPools
。这样,实际连接也会关闭,您的活动监视器将不再显示连接。