0

그래서 저는 최근에 다음과 같은 데이터 액세스 패턴을 사용하는 큰 프로젝트를 상속 받았습니다. 그러나 불행하게도이 때문에 연결 풀링과 관련된 많은 시간 초과 예외가 발생합니다.데이터 블록을 사용 블록에 넣으면 SQL 연결이 닫히지 않습니까?

제한 시간이 만료되었습니다. 풀에서 연결을 얻기 전에 시간 종료 기간이 경과했습니다. 모든 풀링 연결을 사용했다 및 최대 풀 크기 "에 도달했기 때문에이가 발생했을 수 있습니다

이 연결이 누출되고 제대로 닫혀지고하지 않는 것이 분명. 그래서, 프레임 워크는 방법과 DataAccess 클래스가 GetDataReader. 데이터 판독이 참조 될 때

는 그것이 사용 블록 내에 배치되어 있지만, 접속은 여전히 ​​유출된다.

연결이 명시 상기 이유를 차단하여 폐쇄 또는 배치되지 않는다는 사실을 하는가 연결은 얻을 수있다. 팅 누수?

일반적으로 사용하는 블록에 연결을 랩핑하고 사용하는 블록에 데이터 판독기를 랩핑합니다.

분명히이 프레임 워크에는 결함이 있지만 데이터 판독기에 CommandBehavior.CloseConnection 옵션을 사용하면이 문제를 해결할 수 있습니까?

없음 외부 코드는 SqlConnection에 직접 액세스하며이 DataAccess 클래스를 통과해야합니다. 일부 정적 저장소 클래스

public IDataReader GetDataReader(QueryDto dto) 
{ 
    DateTime current = DateTime.Now; 
    Database db = DatabaseFactory.CreateDatabase(dto.DatabaseName); 

    DbCommand cmd = db.GetStoredProcCommand(dto.StoredProcedureName); 

    if (dto.Params.Length > 0) 
    { 
     cmd = db.GetStoredProcCommand(dto.StoredProcedureName, dto.Params); 
    } 

    dto.Command = cmd; 

    cmd.CommandTimeout = dto.Timeout; 
    cmd.Connection = db.CreateConnection(); 

    try 
    { 
     cmd.Connection.Open(); 
    } 
    catch (SqlException ex) 
    { 
     // Handle Exception here... 
     throw; 
    } 

    return rdr; 
} 

사용법 :

var query = new QueryDto 
{ 
    DatabaseName = "SomeDatabase", 
    Params = parms, 
    StoredProcedureName = "StoredProcedureName" 
}; 

using (IDataReader dr = dataAccess.GetDataReader(query)) 
{ 
    while (dr.Read()) 
    { 
     // do stuff here 
    } 
} 
+0

가능한 복제본 [using()을 데이터 보관소에두면 닫을 수 있습니까?] (http://stackoverflow.com/questions/2157276/will-putting-a-using-around-a-datareader-close-it)) – mitch

+0

사실, 내 질문에 대한 데이터 판독기를 사용하여 stmt 처분/제대로 닫을 경우 않습니다. 사용중인 블록에서 연결이 래핑되지 않을 때 기본 SQL 연결이 닫히는 경우 – Abe

답변

1

나는 당신의 문제는 사용하여 문을 그 안에 내장 된 개방형 자원이 함수 주위에 있다고 생각합니다. 사용하면 GetDataReader 안에 열리는 연결을 처분하지 않습니다. Connection 자체가 using 블록에 있어야한다는 것이 맞다고 생각합니다. using statement은 중첩 된 리소스가 아니라 전달 된 개체에 대해서만 Dispose를 호출합니다.