SQL处理.Net 4.0上的泄漏但不是.Net 3.5上的泄漏

时间:2013-08-16 16:09:18

标签: sql .net-4.0 .net-3.5 resource-leak

以下示例代码泄漏句柄。处理计数从133开始,在不到2小时内达到900.样本是VS2010和.Net 4.0。这不会发生在.Net 3.5上。 我已经在超过3台机器上重现了这一点,所有Win2008 R2服务器。 SQL 2008& SQL 2012.这些机器是虚拟机,每周不断回滚两次,所以很干净。

//Reference dll are the ones required for SQL 
//.Net 4.0 (not 'Client Profile' version)
static void Main(string[] args)
{

    string sss = "Data Source=WIN-0BDHQ0IIUFL,1433;Initial Catalog=DB_Mycentral;Persist Security Info=False;User ID=Myuser;Password=123;Connect Timeout=60;Network Library=dbmssocn";
    System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(sss);
    int i = 0;
    while (true)
    {
        i++;

        Thread.Sleep(1000 * 60 * 60);
        Console.WriteLine("{0} hrs sleep", i);
    }
}

我观察到ProcMon.exe中的活动和ProcExp.exe中的调用堆栈。 ProcMon.exe重复记录CreateThread()和ExitThread() 。然后ProcExp.exe显示 对于新创建的TID, cld.dll!StrongNameErrorInfo + 0x18910 。最后,ProcExp.exe中的THREAD对象计数被一个碰撞了。整个过程一次又一次地重复。

Example for leaking of TID 9089:
CreateThread()/ExitThread() TID:9089 //Log in ProcMon.exe
cld.dll!StrongNameErrorInfo+0x18910  TID: 9089  //Call-stack in ProcExp.exe

背景:我编写此示例以缩小生产代码中的泄漏范围。该代码在.Net 3.5中运行良好但在.Net 4.0中泄漏。

如果我必须在打开连接时设置额外的标记,请告诉我。

1 个答案:

答案 0 :(得分:0)

使用'using'确保始终调用dispose方法。

请参阅http://msdn.microsoft.com/en-us/library/yh598w02.aspx

//Reference dll are the ones required for SQL 
//.Net 4.0 (not 'Client Profile' version)
static void Main(string[] args)
{

    string sss = "Data Source=WIN-0BDHQ0IIUFL,1433;Initial Catalog=DB_Mycentral;Persist Security Info=False;User ID=Myuser;Password=123;Connect Timeout=60;Network Library=dbmssocn";
    using(System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(sss))
    {

        int i = 0;
        while (true)
        {
            i++;

            Thread.Sleep(1000 * 60 * 60);
            Console.WriteLine("{0} hrs sleep", i);
        }
    }
}
相关问题