2008-10-20 2 views
6

을 사용할 때 connection/datareader를 닫는 방법으로 연결 풀링 오류 메시지가 발견되었습니다. 따라서 코드가 닫히지 않은 곳에서는 SqlDataReader 개체를 닫고 코드를 살펴 보았습니다. SqlDataSource 또는 ObjectDataSource 태그의 SelectStatement 특성에 지정된 datareader를 닫는 방법 (또는 닫을 필요가있을 경우)을 알아야합니다. 처리되지 않으면 연결 누출이있을 수 있습니까?베타 테스트 중 SqlDataSource 또는 ObjectDataSource

미리 감사드립니다.

답변

12

"특히 데이터베이스에 대한 연결 열기 및 닫기를 처리 할 때"사용 "키워드를 사용하는 경향이 있습니다. "using"은 Dispose 패턴에 대한 바로 가기입니다. here은 MSDN writeup에 대한 링크이고 here은 개요가있는 유용한 블로그 항목에 대한 링크입니다.

+1

여기에 동일합니다. 얼마나 많은 개발자가 'using'키워드를 사용하지 않는 코드를 작성하여 (특히 데이터 보관함과 같은 것을 사용할 때) 객체를 자동으로 처리하는 것에 놀랐습니다. – Mun

2

내 이해는 SqlDataSource으로 연결 관리가 수행되며 두려움이 없습니다.

ObjectDataSource은 처음부터 데이터베이스와 직접 대화하지 않으므로 기본 객체가 연결 및 판독기 관리를 올바르게 수행하는 한 안전합니다.

다른 사람들이 언급했듯이 Close()usingObjectDataSource과 함께 사용하는 수업의 친구입니다.

내 직감은 코드베이스를 효과적으로 제거했다면 아마 그 문제를 근절했을 것입니다.

0

나는 SqlDataSource가 자신의 연결/판독기 문제를 처리 할 것으로 믿고 있으므로 걱정할 필요가 없습니다. 수동 연결에 관해서는, 나는 과거에이 패턴이 유용 발견했습니다 : 그가 ObjectDataSource를 위해 폐쇄는 그 선택 방법에 의해 처리되어야한다

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     try 
     { 
     SqlCommand command = connection.CreateCommand(); 
     command.CommandText = ... 

     connection.Open(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      do 
      { 
       while (reader.Read()) 
       { 
        ... handle each row ... 
       } 
      } while (reader.NextResult()); 
     } 
     } 
     catch (Exception ex) 
     { 
      ... error handling ... 
     } 
     finally 
     { 
     if (connection != null && connection.State == ConnectionState.Open) 
     { 
      connection.Close(); 
     } 
     } 
    } 
-1

동의. 내 ObjectDataSource Select 메서드는 SqlDataReader를 반환합니다. 내 관심사는 ... SqlDataReader는 UI로 반환 한 후 닫을 때 쓸모 없게 렌더링 될 것입니다. 예 : 다음 예제 코드를 참조하십시오. 나는 그것을 시도하지 않았으며 개발의이 단계에서 그것을하고 싶지 않습니다.

SqlDataReader MySelectMethod(){ 
    SqlDataReader dr = null; 
    try{ 
     dr = DBObject.GetDataReader(); 
     return dr; 
    } 
    finally{ 
     dr.Close(); 
    } 
} 

지금까지받은 모든 정보를 제공해 주셔서 감사합니다.

...........

나의 이해는 의 SqlDataSource와, 연결 관리 당신을 위해 수행, 당신은 두려워 할 아무것도 없다는 것입니다.

ObjectDataSource를은 처음부터 직접 데이터베이스 얘기하지 않습니다 은 그래서 안전합니다 -만큼 기본 객체가 올바르게 연결 및 독자 관리 을 수행한다.

다른 언급했듯이, 닫기()와 사용하면

ObjectDataSource를

사용할 클래스에 대한 당신의 친구입니다.

+0

이것은 작동하지 않습니다. finally 블록에 있기 때문에 반환이 발생하면 close가 실행됩니다. 코드는 try 블록을 종료하고 마지막으로 실행됩니다. – tvanfosson

4

특히 레코드 집합의 끝에 도달하지 않은 경우 판독기를 처리하거나 닫기 전에 연결된 명령 개체에서 Cancel()을 호출하는 것이 좋습니다. 예를 들어

:

  using (var cmd = ...)) 
      { 
       using (var reader = (DbDataReader) cmd.ExecuteReader()) 
       { 
        try 
        { 
         ConsumeData(reader); // may throw 
        } 
        catch(Exception) 
        { 
         cmd.Cancel(); 
         throw; 
        } 
       } 
      } 
2

우리는 프로덕션 환경에서 여기에 같은 문제가 있었다.

문제가 해결되었습니다. 먼저 문제는 내 코드에서 문을 전혀 사용하지 않았다는 것입니다. (약간의 지식으로 몇 년 전에 제작되었습니다).

그런 다음 SqlDataSource를 using 절에 넣으려고했습니다. 그러나 이것은 도움이되지 않았습니다.

여기에있는 트릭은 tvanfosson과 Mischa가 제안하는 것처럼 독자를 using 절에 넣는 것입니다. 이것은 실제로 연결을 닫는 객체입니다.

중간로드에서 최소 풀 크기 10으로 축소 된 연결 수입니다.