【问题标题】:Max pool size was reached error for parallel connections并行连接的最大池大小已达到错误
【发布时间】:2017-05-19 10:32:11
【问题描述】:

我有一个 sql 数据库,我正在使用 Microsoft.Practices.EnterpriseLibrary 进行数据库通信。我有一个数据库提供程序类如下:

public class DBProvider
{
    #region Properties
    #region Database

/// <summary>
/// The db instance.
/// </summary>
private Database database;
     #region Ctors

/// <summary>
/// Initializes a new instance of the <see cref="DBProvider"/> class.
/// </summary>
public DBProvider()
{
    DatabaseProviderFactory dbProvider = new DatabaseProviderFactory();
    database = dbProvider.CreateDefault();
}

/// <summary>
/// Initializes a new instance of the <see cref="DBProvider"/> class.
/// </summary>
/// <param name="dbName">
/// The name of the db.
/// </param>
public DBProvider(string dbName)
{
    DatabaseProviderFactory dbProvider = new DatabaseProviderFactory();
    database = dbProvider.Create(dbName);
}
     #endregion
/// <summary>
/// The db instance.
/// </summary>
public Database Database
{
    get { return database; }
    set { database = value; }
}

    #endregion

    #endregion
}

大多数情况下,我使用它的无参数构造函数来获取配置文件中具有默认连接字符串的数据库实例。 以下是我如何在代码中执行 SP 的示例:

DBProvider dbProvider = new DBProvider();
using (DbConnection connection = 
dbProvider.Database.DbProviderFactory.CreateConnection())
    {
        if (connection != null)
        {
            connection.ConnectionString = dbProvider.Database.ConnectionString;
            await connection.OpenAsync();
        }

    using (DbCommand cmd = dbProvider.Database.GetStoredProcCommand(SPName))
    {
        cmd.CommandTimeout = 60;
        cmd.Connection = connection;
        dbProvider.Database.AddInParameter(cmd, ColumnUserId, DbType.StringFixedLength, "someuserID");

        await cmd.ExecuteNonQueryAsync();
    }
}

如果我正在读取数据,我会执行以下操作:

using (var reader = await cmd.ExecuteReaderAsync())
{
    //read data
}

当有大约 10k 用户尝试访问数据库时,我收到此错误: 从池中获取连接之前的超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。

在我的配置文件中,我提到了最大池大小为 100(尽管如果没有提到它是默认值)。我该如何解决这个问题?

编辑: 当我运行select * from myDB..sysprocesses 时,它使用AWAITING 命令显示它有100 个处于睡眠状态的进程。但在我的代码中,我现在明确地执行connection.Close()

我认为问题在于 AWS RDS 没有重用池中的连接。因为我在连接到本地数据库时运行相同的代码并且它工作正常。

【问题讨论】:

  • 您是否在代码中的任何位置使用 TransactionScope?
  • 没有。我没有在任何地方使用它。
  • 我认为问题在于 AWS RDS 没有重用池中的连接。当我在连接到本地数据库时运行相同的代码并且它工作正常。

标签: c# sql enterprise-library amazon-rds


【解决方案1】:

这听起来有点奇怪,因为我没有任何参考资料提到它,但我能够通过将 DataReader 替换为 DataTable 来读取我的 SP 返回的数据来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多