2014-03-03 5 views
4

오해 일 수도 있지만 큰 문제가 있습니다. 다음 코드를 고려하십시오.실제로 SQL 연결을 닫을 수 있습니까

static void Main(string[] args) 
{ 
    using (SqlConnection con = new SqlConnection(connectionString)) 
    { 
     con.Open(); 
     int i = 10; 
     con.Close(); 
     con.Dispose(); 
    } 
    int y = 10; 
} 

int y = 10 줄에 중단 점을 배치하십시오.

이제 SQL Server로 이동하여 위의 코드에서 connectionString과 동일한 연결 인 SQl Connection을 마우스 오른쪽 단추로 클릭하고 "Activity Monitor"를 선택하십시오. 위의 코드를 실행하고 SQL Server 활동 모니터를 확인하십시오. con.Open()이 실행되면 활동 모니터에 연결이 이루어진 것으로 표시됩니다. 여태까지는 그런대로 잘됐다! 그러나 커서가 int y = 10;을 나타내는 행에 닿으면 Activity Monitor는 여전히 존재하지 않는 연결을 보여줍니다! 내가 그것을 닫았 기 때문에, 나는 그것을 폐기했고 심지어 사용하는 문장을 통과시켰다.

연결을 어떻게 닫을 수 있는지 아는 사람 있습니까?

+8

이 동작은 정상이며 연결 풀링으로 인한 것입니다. 즉시 연결을 닫으려면 연결 문자열에서 연결 풀링을 비활성화해야하지만 성능이 저하됩니다. –

+0

마이클의 코멘트에 추가하기, this [thread] (http://stackoverflow.com/questions/20203117/using-keyword-doesnt-close-an-open-sql-connection) – Andrei

+2

당신의'Dispose' 콜은 불필요합니다. 'using '이 당신을 위해 캡슐화하고있는 것. – noelicus

답변

8

올바르게 연결 작업을 수행하는 연결 풀입니다. 거의 모든 상황에서 이것은 입니다. 좋은 점은입니다. 이 작업을 원하지 않으면 연결 문자열을 통해 연결 풀을 비활성화하십시오.

기본적으로, 당신은 별도의 두 개념을 유지해야 다음 SqlConnection는, 정상적인 사용에서 관리되지 않는 연결 개체

을 기본 닫거나 관리 처분 연결 인스턴스

  • 관리
    • 연결은 관리되지 않는 연결을 풀에 다시 넣기 때문에 즉시 사용할 수 있습니다. 관리되는 연결과 관리되지 않는 연결이 함께 끊어 지도록하려면 연결 풀링을 사용하지 않도록 설정해야합니다.

  • 4

    .NET의 데이터베이스 연결은 기본적으로 풀링됩니다. 즉, 하나의 연결 인스턴스 (SqlConnection)가 닫히더라도 프레임 워크는 실제로 기본 연결을 유지하여 새로운 연결을 더 빨리 만들 수 있습니다. 좋은 이유가 없으면 좋은 성능 향상을 얻을 수 있기 때문에 아마도이 문제를 망치고 싶지 않을 것입니다.

    실제로 풀에 남아있는 모든 연결을 닫을 수 있습니다. SqlConnection.ClearPool 또는 더 큰 해머를 사용하여이를 수행 할 수 있습니다 (SqlConnection.ClearAllPools). 이를 통해 실제 연결이 닫히고 활동 모니터에 더 이상 연결이 표시되지 않습니다.

    +0

    감사합니다, 당신은 내 하루를 보냈습니다! – user3375740