SQL Server中的连接泄漏问题

时间:2009-09-30 18:10:24

标签: c# .net sql-server sql-server-2008 ado.net

我使用的是SQL Server 2008 Enterprise + C#+ ADO.Net + .Net 3.5。我在ADO.Net客户端使用连接池(ADO.Net的默认行为)。我正在使用sp_who2或sys.dm_exec_connections来查找活动连接数(如果我找到有效连接数的方法错误,请告诉我。)

如果每次创建并打开一个新的ADO.Net连接对象后,我将使用匹配的close语句在使用连接对象后关闭ADO.Net连接对象实例(执行存储过程),我想知道在这种情况下,从我的ADO.Net客户端应用程序关闭所有连接后,活动连接数应始终为0,如果显示活动连接数> 0,应该很奇怪吗?

提前谢谢, 乔治

3 个答案:

答案 0 :(得分:6)

关闭将释放连接以使connection pool可用。这并不意味着物理连接已关闭。

还要确保.close在finally中,因此它会在常规流程和异常发生时执行。

答案 1 :(得分:4)

确保正确关闭或处置SqlConnection。处置连接将自动关闭它。

using(SqlConnection connection = new SqlConnection(connectionString))
{
} //The connection will close automatically here

但是你可以明确地在使用结束之前做一个.Close()。

您还可以通过调用

清除状态为等待命令的所有待处理连接
SqlConnection.ClearAllPools();

答案 2 :(得分:2)

不是这样,在调用Close之后,ADO.NET连接池将返回到池的连接。此时连接可能不会真正关闭。要强制关闭连接,请在关闭之前清除池。试试这个,你应该看到连接从服务器关闭。

var conn = new SqlConnection("a server goes here");
        conn.Open();

        SqlConnection.ClearAllPools();
        conn.Close();