【问题标题】:Are my connections being returned to the pool if I don't Dispose my IDataReader?如果我不处置我的 IDataReader,我的连接是否会返回到池中?
【发布时间】:2014-01-13 18:28:06
【问题描述】:

我正在尝试确定代码库中是否存在明显错误。

有问题的代码调用返回 IDataReader 的第三方 dll。如果代码使用 reader 而不处理它,它不会显式返回到池中,对吗?

这是调用代码:

IDataReader rdr = db.ExecSPGetDataReader("dbo.someStoredProcedure", paramList);
if (rdr.Read())
{
    List<nameValuePair> formValues = Utils.nameValuePairs(rdr["valuepairs"].ToString());
    foreach (nameValuePair nvp in formValues)
    {
        if (nvp.name.ToLower() == "name")
        {
            outString = nvp.value;
            break;
        }
    }
}

这是反编译的第三方dll代码:

    public IDataReader ExecSPGetDataReader(string sp, List<param> paramList)
    {
        IDataReader dataReader;
        using (DbCommand dbC = this.setDBCommand(sp, paramList, true))
        {
            IDataReader dr = this._db.ExecuteReader(dbC);
            this.setOutputParams(dbC, paramList);
            dataReader = dr;
        }
        return dataReader;
    }

看起来命令被释放了,可能是为了释放连接,但如果这是真的,如何从返回的 IDataReader 中读取任何内容?

【问题讨论】:

  • 返回的IDataReader是否需要保留DbCommand才能正常工作?
  • 只是一个旁注 - 暴露裸数据阅读器是一种可怕的设计。我不羡慕你。至少确保在读完数据后将它们丢弃。
  • @spender 这就是我的问题。我在想的是 IDataReader 挂在数据库连接上

标签: c# .net sql-server ado.net connection-pooling


【解决方案1】:

如果代码使用阅读器而不处理它,它不会显式返回到池中,对吗?

没错。把代码改成这样:

using (IDataReader rdr =
    db.ExecSPGetDataReader("dbo.someStoredProcedure", paramList))
{
    if (rdr.Read())
    {
        List<nameValuePair> formValues =
            Utils.nameValuePairs(rdr["valuepairs"].ToString());
        foreach (nameValuePair nvp in formValues)
        {
            if (nvp.name.ToLower() == "name")
            {
                outString = nvp.value;
                break;
            }
        }
    }
}

using 语句将确保调用 Dispose

【讨论】:

  • 谢谢迈克尔。我看到连接数急剧上升,然后又下降。我猜连接只是停留了足够长的时间,没有被用来返回到池中。
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2011-03-31
相关资源
最近更新 更多