2010-04-26 11 views
4

다음 코드가 있습니다. conn == null을 사용하면 마지막으로 연결 풀링을 계속 사용합니까? 연결을 닫는 것이 좋지만 전체 연결 개체를 삭제하는 것은 어떻습니까?연결 풀링

public void ExecuteNonQuery(SqlCommand Cmd) 
    { 
     //========== Connection ==========// 
     SqlConnection Conn = new SqlConnection(strConStr); 

     try 
     { 
      //========== Open Connection ==========// 
      Conn.Open(); 

      //========== Execute Command ==========// 
      Cmd.Connection = Conn; 
      Cmd.CommandTimeout = 180; 
      Cmd.ExecuteNonQuery(); 
     } 
     catch (Exception Exc) 
     { 
      throw Exc; 
     } 
     finally 
     { 
      //======== Closing Connection ========// 
      if (Conn.State == ConnectionState.Open) 
      { Conn.Close(); } 

      //======== Disposing object ========// 
      Conn = null; 
     } 
    } 
+3

당신이 얻고있는 답변 중 "이유"를 설명하기위한 몇 가지 요지 ... '예외 실행'은 예외의 스택 추적을 대체하므로 디버깅하기가 어렵습니다. 대신에'throw '라고 쓰거나 catch를 완전히 내 버릴 수 있습니다. 'Conn = null'은 효과적으로 아무것도하지 않습니다. 당신은 Conn.Dispose()를 찾고 있습니다 (닫는 것을 처리 할 것입니다). 그리고'using()'블럭은 try/finally/dispose의 줄임말입니다. LOC를 줄이는 가장 좋은 방법은 ... –

답변

6

먼저 using을 사용하는 것이 좋습니다. 둘째, 프레임 워크가 처리를 처리하도록하십시오. managed providers은 연결 문자열을 기반으로 풀링을 수행합니다.

public void ExecuteNonQuery(SqlCommand Cmd) 
{ 
    //========== Connection ==========// 
    using(SqlConnection Conn = new SqlConnection(strConStr)) 
    { 
     //========== Open Connection ==========// 
     Conn.Open(); 

     //========== Execute Command ==========// 
     Cmd.Connection = Conn; 
     Cmd.CommandTimeout = 180; 
     Cmd.ExecuteNonQuery(); 
    } 
} 
0

null로 설정하면 기능의 끝 부분에서 범위를 벗어날 수 있으므로 중복됩니다. 예. 연결 풀링을 사용하는 경우 여전히 연결 풀링을 사용하고 있습니다.

+0

감사합니다. 도움이되었습니다. – user291660

+0

하지만 연결을 "닫는"(relinquishing) 않고도 풀의 연결이 빨리 끊어 질 수도 있습니다. –

4
  • 당신은 널 (null)하거나 .NET에서 아무것도 아무것도 설정할 필요가 없습니다. 이는 Garbage Collection에 의해 자동으로 처리됩니다.

  • Conn.Dispose()을 모두 오류 처리에서 호출하고 모든 것이 계획대로 진행되면 반드시 수행해야합니다. Try Catch Finally 블록은이 작업에 적합합니다. 또 다른 방법은 연결을 선언 할 때 Using 키워드를 사용하여 Connection 개체가 발생하는 모든 상황을 적절히 처리하도록하는 것입니다.

  • 연결 풀링에 대해 걱정할 필요가 없습니다. 당신이 그것을 사용할 필요가있을 때마다 새로운 것을 열면 이것은 괜찮습니다. ADO.NET은 백그라운드에서 연결을 풀링합니다. 동일한 연결 객체를 재사용하면 사소한 성능이 있지만 일을 단순하게 유지하면 걱정할 필요가 없습니다.

다음 코드를 사용하여 동일한 작업을 수행 할 수 있습니다. 결과는 동일합니다. 오류 발생 여부와 상관없이 Conn은 올바르게 처리됩니다. 이전과 같이 오류가 발생합니다. 당신을 취급하는 유일한 오류가 원하는/필요

public void ExecuteNonQuery(SqlCommand Cmd) 
{ 
    Using (SqlConnection Conn = new SqlConnection(strConStr)); 
    { 
     //========== Open Connection ==========// 
     Conn.Open(); 

     //========== Execute Command ==========// 
     Cmd.Connection = Conn; 
     Cmd.CommandTimeout = 180; 
     Cmd.ExecuteNonQuery(); 
    } 
} 

당신이 볼 수 있듯이

는 반드시 당신의 연결 개체가 적절히 배치되어 있는지 확인하는 것입니다의 사용 구문은 상황이 정돈 할 수 있습니다.

+0

감사합니다. 게시물도 도움이되었습니다. 답변으로 여러 답장을 표시 할 수 있는지 확신 할 수 없습니다. – user291660

+0

하나의 "수락 된 대답"만있을 수 있으며 다른 하나를 선택하기 위해 선택을 취소해야합니다. 너가 또 다른 한개에 침착하는 경우에, 고민하지 말라! 당신은 확실히 당신을 도울 수있는 좋은 시도를 한 사람을 업 보그하고 싶습니다. (당신이 15 번 생각할 필요가 있습니다). Stackoverflow에 오신 것을 환영합니다. 보시다시피 도움을 얻을 수있는 좋은 곳입니다! –

0

개체를 처분하고 풀링을 사용할 수 있습니다.

그리고 또한

  1. 관리되는 응용 프로그램 FF로
  2. 는 웹 어플리케이션
  3. 인가는 다음 개체를 폐기

보통 garbagecollector으로 당신에게 큰 부탁을 할 것입니다 무거운 트래픽이 성능을 저장하기에 충분하지 않습니다.