如何解决“从池中获取连接之前经过的超时时间”?

时间:2015-08-04 06:15:12

标签: c# asp.net .net asp.net-mvc ado.net

我们一直在生产服务器中收到此错误。

  

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

这是我从数据库中读取的方式

    objDataEngine.InitiateConnectionAsync();
        SqlParameter[] Parameters = new SqlParameter[3];
        ...
        var execResult = await objDataEngine.ExecuteCommandAsync("WebBrandListSelect", CommandType.StoredProcedure, Parameters);

         while (execResult.Read())
         {
           //read from datareader
         }

         objDataEngine.CloseConnection();

InitiateConnectionAsync的代码是:

       public async Task InitiateConnectionAsync()
            {

                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
                builder.DataSource = ConfigurationManager.AppSettings[this.database];
                builder.InitialCatalog = this.database;
                builder.UserID = this.username;
                builder.Password = this.password;
                Connection.ConnectionString = builder.ConnectionString;
                await Connection.OpenAsync();
            }

ExecuteCommandAsync

的功能
  public async Task<SqlDataReader> ExecuteCommandAsync(string commandText, CommandType type, SqlParameter[] parameters = null)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandTimeout = 400;
            cmd.Connection = Connection;
            cmd.CommandType = type;
            cmd.CommandText = commandText;
            cmd = AssignParameters(cmd, parameters);
            SqlDataReader Reader =await cmd.ExecuteReaderAsync();
            this.ObjReader = Reader;
            this.ObjSqlCommand = cmd;
            return Reader;
        }

最后是CloseConnection

的代码
public  void CloseConnection()
{
    this.Connection.Close();
    this.Connection.Dispose();
    if (this.ObjReader!=null)
    {
        this.ObjReader.Close();
        this.ObjReader.Dispose();
        this.ObjReader = null;

    }
    if (this.ObjSqlCommand!=null)
    {
        this.ObjSqlCommand.Dispose();
    }

}

如果您的代码中发现任何错误,请提供帮助。我的datareader是否有可能没有妥善处置?

1 个答案:

答案 0 :(得分:1)

连接上有一个连接超时属性,它与命令超时无关,因此可能值得尝试设置它。您可以在代码或连接字符串中设置它,如果您使用的是SQL / Server,则在连接字符串中将其称为“Connect Timeout =”。

我已经快速查看了您的代码 - 我对处理连接然后处理读取器和命令感到不安。我认为你应该按顺序处理命令,阅读器和连接,虽然我通常不会使用处理代码,除非我有理由 - 垃圾收集器通常对于许多场景都足够好。

如果这没有帮助,我会查看系统配置选项,例如连接池大小等。