그래서 저는 최근에 다음과 같은 데이터 액세스 패턴을 사용하는 큰 프로젝트를 상속 받았습니다. 그러나 불행하게도이 때문에 연결 풀링과 관련된 많은 시간 초과 예외가 발생합니다.데이터 블록을 사용 블록에 넣으면 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
}
}
가능한 복제본 [using()을 데이터 보관소에두면 닫을 수 있습니까?] (http://stackoverflow.com/questions/2157276/will-putting-a-using-around-a-datareader-close-it)) – mitch
사실, 내 질문에 대한 데이터 판독기를 사용하여 stmt 처분/제대로 닫을 경우 않습니다. 사용중인 블록에서 연결이 래핑되지 않을 때 기본 SQL 연결이 닫히는 경우 – Abe