【问题标题】:Timeout Expired: Connection Pool超时已过期:连接池
【发布时间】:2009-09-23 14:21:37
【问题描述】:

这是我们得到的错误。我们将应用程序和数据库服务器从 32 位移至 x64。服务器上安装了 Framework 2.0 service pack 2。

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

下面是一些 DataAccess 代码,它从 Try 块中返回一个值:

 public string GetSomething()
        { var a = String.Empty; 

            try 
            {
               // loop through the datareader 

                return "some data"; 
            }

            finally
            {
                reader.close(); 
            }

            return whatever; 
        }

下面是一些打开和管理连接的代码:

public DBHelper(IDbCommand command) 
        {

            this.command = command;

            if (command.Connection.State == ConnectionState.Open)
            {

                shouldCloseConnection= false;
            }
            else
            {

                command.Connection.Open();
                shouldCloseConnection= true;
            }           
        }

【问题讨论】:

    标签: asp.net sql-server


    【解决方案1】:

    A) 确保您的最小池大小足够大。可能是 20 或 30 之类的。

    B) 请注意正确处理物品。我了解到,例如,当您使用 IDataReader 从数据库中获取内容时,您应该这样做

    使用 (IDataReader rdr = ...) {

    }

    这样,无论 rdr 是什么(包括错误)都会被处理掉。无论如何,有时池问题是由于未正确处理数据库连接引起的。

    【讨论】:

    • 原来是其中一个基础库中的连接泄漏。
    【解决方案2】:

    尝试使用

    SqlConnection.ClearAllPools()
    

    看看这是否真的是连接池问题。

    【讨论】:

      【解决方案3】:

      不是直接的答案,但请查看活动监视器并查看为应用程序打开的连接。也许您之前安装中的超时设置被设置为缩短,导致连接在池填充之前被 SQL 强制关闭。

      【讨论】:

      • 在活动监视器中它说大多数连接都在休眠。我认为这意味着它们在池中等待使用。
      猜你喜欢
      • 2014-01-29
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多