繁体   English   中英

并行连接达到最大池大小错误

[英]Max pool size was reached error for parallel connections

我有一个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
}

当大约有1万名用户尝试访问db时,我收到此错误: 从池中获取连接之前已超时。 这可能是因为所有池化连接都在使用中,并且达到了最大池大小。

在我的配置文件中,我提到最大池大小为100(尽管未提及,这是默认值)。 我该如何解决?

编辑:当我运行时, select * from myDB..sysprocesses它表明它具有100个处于AWAITING命令的Sleeping状态的进程。 但是在我的代码中,我现在正在显式地执行connection.Close()

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

听起来有些奇怪,因为我没有提及它的任何引用,但是我能够通过用DataTable替换DataReader来读取SP返回的数据来解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM