以下示例代码泄漏处理。句柄计数从133开始,不到2小时就达到了900。示例是VS2010和.Net 4.0。这种情况在.Net 3.5上不会发生。我已经在3台以上的机器上复制了这一点,所有的Win2008R2服务器。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显示cld.dll!StrongNameErrorInfo+0x18910针对新创建的TID。最后,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中泄漏。
如果在打开连接时必须设置额外的标志,请告诉我。
使用'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);
}
}
}