2013-08-16 1 views
3

다음 샘플 코드 누수가 처리됩니다. 손잡이 수는 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에서는 누출되었습니다.

연결을 여는 동안 추가 플래그를 설정해야하는지 알려주세요.

+2

를 참조하십시오. http://dotnettips.wordpress.com/2011/10/24/net-4-0-bug-with-sqlconnection-object/ –

+0

질문을 작성하는 데 걸리는 시간을 고려하여 SqlConnection 누출 핸들링에 대한 검색이 개선되었을 것입니다. ... 그것은 꽤 유명해 보입니다. 이것은 당신이 proble, 첫 번째 구글을 가지고있는 것을 보여줍니다. – xanatos

+0

감사합니다. 나는 MS가 제안한 해결책을 시도 할 것이다. – user1174790

답변

0

'사용'을 사용하여 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); 
     } 
    } 
} 
관련 문제