다음 샘플 코드 누수가 처리됩니다. 손잡이 수는 133에서 시작되었고 2 시간 이내에 900에 도달했습니다. 샘플은 VS2010 및 .Net 4.0입니다. 이것은 닷넷 3.5에서 발생하지 않습니다. 저는 이것을 3 대 이상의 모든 Win2008 R2 서버에서 재현했습니다. 두 SQL 2008 & SQL 2012. 이러한 컴퓨터는 VM이며 일주일에 두 번씩 지속적으로 롤백되므로 깨끗합니다..Net 4.0에서 SQL 핸들 누수가 있지만 .Net 3.5에서는 발생하지 않습니다.
//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에서는 누출되었습니다.
연결을 여는 동안 추가 플래그를 설정해야하는지 알려주세요.
를 참조하십시오. http://dotnettips.wordpress.com/2011/10/24/net-4-0-bug-with-sqlconnection-object/ –
질문을 작성하는 데 걸리는 시간을 고려하여 SqlConnection 누출 핸들링에 대한 검색이 개선되었을 것입니다. ... 그것은 꽤 유명해 보입니다. 이것은 당신이 proble, 첫 번째 구글을 가지고있는 것을 보여줍니다. – xanatos
감사합니다. 나는 MS가 제안한 해결책을 시도 할 것이다. – user1174790