所以,我最近继承了一个使用以下数据访问模式的大型项目;不幸的是,这导致了大量与连接池相关的超时异常。
超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到最大池大小”
很明显,连接正在泄漏并且没有正确关闭。因此,该框架有一个DataAccess
带有方法的类GetDataReader
。
当数据读取器被引用时,它被放置在一个 using 块内,但连接仍在泄漏。
连接未显式关闭或放置在 using 块中的事实是否是连接泄漏的原因?
通常,我会将连接包装在 using 块中,并将数据读取器包装在 using 块中。
显然,这个框架有很大的缺陷,但是使用CommandBehavior.CloseConnection
数据读取器的选项会以某种方式解决这个问题吗?
None 外部代码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
}
}