2013-03-21 1 views
8

나는이 질문에 대해 상충되는 결과를 계속 찾습니다. 의는 SQL 쿼리를 실행의 C# 코드를 살펴 보자 :using 키워드로 SQL Server 연결을 닫아야합니까?

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    cn.Open(); 

    using (SqlCommand cmd = new SqlCommand(strSQL, cn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 

    //Do I need to call? 
    cn.Close(); 
} 

내가 마지막 cn.Close()를 호출해야합니까? 내가 요청하는 이유는 무거운 트래픽 웹 응용 프로그램에서 연결이 끊어지기 때문입니다.

답변

10

여기에 사용 된 using 키워드 : 어떤 차례로 즉시

SqlConnection cn = null; 
try 
{ 
    cn = new SqlConnection(strConnectString); 
    // Stuff 
} 
finally 
{ 
    if (cn != null) cn.Dispose(); 
} 

cn.Dispose() 즉시cn라는 using의 범위를 벗어나됩니다

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

에 대한 짧은 SqlConnection.Dispose()가 연결을 종료하기 때문에 연결을 닫습니다.

UPDATE

이 가비지 컬렉션과 혼동되어서는 안된다. GC는에서 비 결정적입니다.NET, 정확히 IDisposable inteface 및 Dispose Pattern 소개 된 이유입니다. IDisposable을 사용하면 값 비싼 리소스를 적시에 결정적 방식으로 릴리스 할 수 있습니다.

1

Using 문을 사용할 때 연결을 닫을 필요가 없습니다.

Scott hanselman이 여기에서 설명합니다 Why The Using Statement Is Better Than A Sharp Stick In The Eye And A SqlConnection Refactoring Example.

트래픽이 많은 웹 응용 프로그램에서 풀이 끊어졌습니다.

SQL에서 연결 풀링을 사용하여 동일한 연결 문자열을 사용하고 있는지 확인하십시오.

연결이 즉시 폐쇄, 또는 그 쓰레기 컬렉터가에 도달 할 때 닫혀

편집 :

파기하는 패턴은 자원의 결정적 파괴를 제공하는 데 사용됩니다. 닷넷 런타임 가비지 컬렉터는 비 결정적이기 때문에 런타임이 오래된 객체를 수집하고 파이널 라이저를 호출 할 때 절대 확신 할 수 없습니다. 따라서 Dispose 패턴을 올바르게 구현하면 리소스의 결정적 릴리스를 제공하고 소비자가 부주의하고 개체를 처리하지 않는 경우 Finalizer가 개체를 정리합니다.

+0

감사합니다. 질문은 - 연결이 즉시 닫히는가, 또는 가비지 수집기가 연결될 때 닫히는가? 그게 내 사건에 영향을 미치기 때문이야. – c00000fd

+0

"동일한 연결 문자열을 사용하고 있는지 확인하십시오."- 그 의미는 무엇입니까? 'SqlConnection cn'을 정적 변수로 정의 하시겠습니까? – c00000fd

+1

'비 결정적 마무리 '= ** 잘못된 **. 연결은'using' 문을 벗어난 직후 처리됩니다. 그건 쓰레기 수집과 관련이 없습니다. 사실, 비 결정적 GC는 정확히 IDisposable 인터페이스와 Dispose Pattern이 .NET에 도입 된 이유입니다. –

1

내부적으로 Displose()을 호출하므로 using을 사용하는 경우 닫을 필요는 없습니다.

여기에 ADO.NET의 using 키워드에 대한 세부 정보가 나와 있습니다.

Leveraging the "using" keyword in C#

빠른 검색 @SO는 너무 거기에 답을 찾을 수 있습니다 this post, 당신을 이끌 것입니다.

관련 문제