我怎么能真正关闭SQL连接

时间:2014-03-03 16:49:59

标签: c# sql sql-server sqlconnection

这可能是我的误解,但我确实有很大的问题。请考虑以下代码:

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;的行时,活动监视器仍会显示不应存在的连接!因为我关闭它,我处理它,甚至我也通过了使用声明。

有谁知道如何关闭连接?

2 个答案:

答案 0 :(得分:8)

这是连接池,正确地完成了它的工作。几乎在所有情况下,这都是好事。如果您不想这样:通过连接字符串禁用连接池。

基本上,您需要保留单独的2个概念:

  • SqlConnection托管连接实例
  • 底层非托管连接对象

在正常使用情况下,关闭或部署托管连接只会将非托管连接放回池中,以备快速使用。如果希望托管和非托管连接一起消亡,则必须禁用连接池。

答案 1 :(得分:4)

默认情况下,汇集.NET中的数据库连接。这意味着虽然连接的单个实例(SqlConnection)已关闭,但框架实际上将保持底层实际连接以允许更快地创建新连接。除非你有充分的理由,否则你可能不想乱用它,因为它确实会给你带来良好的性能提升。

话虽这么说,你实际上可以强制池关闭它仍然拥有的所有连接。您可以使用SqlConnection.ClearPool执行此操作,或者使用更大的锤子SqlConnection.ClearAllPools。这样,实际连接也会关闭,您的活动监视器将不再显示连接。