0

所以,我最近继承了一个使用以下数据访问模式的大型项目;不幸的是,这导致了大量与连接池相关的超时异常。

超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到最大池大小”

很明显,连接正在泄漏并且没有正确关闭。因此,该框架有一个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
    }
}
4

1 回答 1

1

我认为您的问题是 using 语句围绕一个嵌入了开放资源的函数。using 不会处理在内部打开的连接GetDataReader。我认为你是正确的,连接本身需要在 using 块中。using 语句只对传入的对象调用 Dispose,而不是任何嵌套资源。

于 2013-07-30T16:00:19.737 回答