【问题标题】:Pooling for DbDataReaderDbDataReader 的池化
【发布时间】:2011-07-22 11:22:17
【问题描述】:

我们有一个用于从我们的应用程序连接 SQL Server 2005 的 DbDataReader。我想知道如何为 DbDataReader 设置以下两个

1) 池化 = 假

2) 连接超时=0;

请分享你的想法。

    DbCommand cmd = db.GetStoredProcCommand("aspInsertZipCode");
    cmd.CommandTimeout = 0;
    dataStringToProcess.Remove(dataStringToProcess.Length - 1, 1);

    db.AddInParameter(cmd, "@DataRows", DbType.String, dataStringToProcess.ToString());
    db.AddInParameter(cmd, "currDate", DbType.DateTime, DateTime.Now);
    db.AddInParameter(cmd, "userID", DbType.Int32, UserID);
    db.AddOutParameter(cmd, "CountOfUnchangedZipCode", DbType.String, 1000);

    DbDataReader rdr = null;

    try
    {

        rdr = (DbDataReader)db.ExecuteReader(cmd);
        if (rdr.Read())
        {

            if (!String.IsNullOrEmpty(Utility.GetString(rdr, "NewZipCode")))
                strNewZipCode = strNewZipCode + "," + Utility.GetString(rdr, "NewZipCode");

        }
        rdr.NextResult();
        if (rdr.Read())
        {

            strRetiredZipCode = strRetiredZipCode + "," + Utility.GetString(rdr, "RetiredZipCode");

        }

        int TempUnchageZipCount = Convert.ToInt32(db.GetParameterValue(cmd, "CountOfUnchangedZipCode"));
        CountOfUnchangedZipCode = CountOfUnchangedZipCode + TempUnchageZipCount;
        dataStringToProcess = new StringBuilder();
        cntRec = 0;

    }
    catch
    {
        if (rdr != null && (!rdr.IsClosed))
            rdr.Close();
        throw;
    }
    finally
    {
        if (rdr != null && (!rdr.IsClosed))
            rdr.Close();
    }
    cmd.Dispose();

谢谢

【问题讨论】:

  • 你知道using(DbDataReader rdr = db.ExecuteReader(cmd)) {...} 会用null/try/catch/finally/Close()/Dispose()/IsClosed 代替所有这些乱七八糟的东西吗?另外:您忘记处理 cmd ;p

标签: c# .net asp.net sql-server ado.net


【解决方案1】:

连接池由特定的提供者处理。您使用的是抽象的DbConnection,但例如,Sql Server 通过连接字符串处理连接池和超时,例如:

SERVER=127.0.0.1;Database=MyDatabase;Integrated Security=true;Timeout=0;Pooling=false;

您实际使用的是什么提供商?

另一方面,您需要什么原因来禁用连接池和超时?这两个功能都是效率功能,可以极大地改善您的应用程序的性能。通过禁用这些,并使用一些行为不佳的代码,您最终可能会得到一个非常不稳定的最终解决方案,这会占用内存并可能导致未终止的连接....?

【讨论】:

  • 我们正在使用企业库。我理解这种方法的缺点;但是我们需要使用 pooling = false 和 Timeout 0 进行测试 ----- Database db = DatabaseFactory.CreateDatabase(); DbCommand cmd = db.GetStoredProcCommand("aspg");
  • 在连接字符串本身中设置这些值是一种方法。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 2018-07-11
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多