2009-05-14 2 views
37

몇 가지 메서드가있는 간단한 정적 클래스가 있습니다. 각 메서드는 SqlConnection을 열고 데이터베이스를 쿼리하고 연결을 닫습니다. 이 방법을 사용하면 데이터베이스 연결을 항상 닫을 수 있지만 다른 한편으로는 항상 연결을 열고 닫는 것을 좋아하지 않습니다. 아래는 내 방법이 어떻게 생겼는지 보여주는 예입니다.언제 SQL Server에 대한 연결을 열고 닫아야합니까?

public static void AddSomething(string something) 
{ 
    using (SqlConnection connection = new SqlConnection("...")) 
    { 
     connection.Open(); 
     // ... 
     connection.Close(); 
    } 
} 

메서드가 정적 클래스 내부에 있다는 것을 고려하면 하나의 SqlConnection을 포함하는 정적 멤버가 있어야합니까? 언제, 어떻게하면 안되나요? 모범 사례는 무엇입니까?

답변

45

아니요. 고정적 인 상태로 유지하지 않으려면 SqlConnection해야합니다. 스레딩은 하나의 관심사이지만 더 중요한 것은 - 일반적으로 간단하게 할 필요가 없다는 것입니다. 제시된대로 코드를 사용하면 내부 연결 풀링은 (동일한 연결 문자열을 사용하는 한) 대부분의 경우 연속 통화에서 동일한 기본 연결을 얻을 수 있음을 의미합니다. 풀러가 그 일을하도록하십시오; 코드를 혼자 두십시오.

이렇게하면 두 개의 스레드가 시작될 때 발생하는 문제를 피할 수 있습니다. 이제 각각은 자체 연결에서 작업을 수행 할 수 있습니다. ([ThreadStatic]을 사용하지 않는다고 가정 할 때) 지연을 도입하여 동기화해야합니다. 재진입 (re-entrancy) (즉, 동일한 연결을 동시에 두 번 사용하려는 단일 스레드)은 말할 것도 없습니다. 예; 코드를 혼자 두십시오. 지금은 괜찮습니다. 거의 모든 변경 사항을 적용하면 문제가되지 않습니다.

3

대부분의 프로그래머는 오픈이 늦고 가깝다고 믿습니다. 이는 매번 연결을 열고 닫을 때 대기 시간으로 인해 전체 응용 프로그램의 속도가 느려지는 경우에만 문제가됩니다.

정적 클래스를 사용하는 경우 매번 연결을 열고 닫는 것이 가장 좋습니다.

+1

+1 다운 보트를 오프셋합니다. sp_resetconnection에 대한 호출이 풀링 된 재 열려 경우에도 일부 (비록 작은 경우에도) 대기 시간이 발생합니다. – Andomar

1

우수 사례를 수행 중입니다. 쿼리하기 바로 전에 열어보고 최대한 빨리 닫으십시오. 이런 종류의 일은 처음에는 낭비가 될지 모르지만 실제로는 장기적으로 애플리케이션을 확장 성있게 만듭니다.

+0

이것은 확장 성이 가능한 경우에만 적용됩니다. 예 : 임베디드 된 데이터베이스가있는 앱에는 여러 가지 고려 사항이 적용됩니다. –

18

Open() 및 Close()를 호출 할 때 SqlConnection에 연결 풀이 있으므로 실제로 서버에 대한 실제 연결을 열고 닫지는 않습니다. 사용 가능한 연결 풀에서 연결을 추가하거나 제거하는 것입니다. 이런 이유로 가능한 한 늦게 연결을 열고 명령을 실행 한 후 가능한 한 빨리 연결을 종료하는 것이 좋습니다.

5

코드 샘플에서는 using 블록 내에있는 코드로 인해 자동으로 처리되므로 연결 개체에서 close() 메서드를 호출 할 필요가 없습니다.

-1

자체를 닫기 위해 연결에 의존하지 마십시오. 명시 적으로 닫히지 않으면 성능 문제가 발생할 수 있습니다. 우리 프로젝트에서 우연히 발생했습니다. 예, 연결은 연결 풀로 관리되지만 연결을 풀고 풀로 반환해야한다는 것을 알고 있습니다.

+0

그는 SqlConnection 주변에서 '사용'전화를 받았으므로 어쨌든 연결이 완료되면 처리해야합니다. – lisburnite