达到并行连接的最大池大小错误
Max pool size was reached error for parallel connections
我有一个 sql 数据库,我正在使用 Microsoft.Practices.EnterpriseLibrary 进行数据库通信。我有一个数据库提供者 class 如下:
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
它显示它有 100 个进程处于休眠状态 AWAITING
命令。但是在我的代码中,我现在正在明确地做 connection.Close()
。
我认为问题出在 AWS RDS 没有重用池中的连接。正如我 运行 在连接到我的本地数据库时使用相同的代码并且它工作正常。
这听起来可能有点奇怪,因为我没有任何参考资料提及它,但我能够通过将 DataReader
替换为 DataTable
来解决问题,以读取我的 SP 返回的数据。
我有一个 sql 数据库,我正在使用 Microsoft.Practices.EnterpriseLibrary 进行数据库通信。我有一个数据库提供者 class 如下:
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
它显示它有 100 个进程处于休眠状态 AWAITING
命令。但是在我的代码中,我现在正在明确地做 connection.Close()
。
我认为问题出在 AWS RDS 没有重用池中的连接。正如我 运行 在连接到我的本地数据库时使用相同的代码并且它工作正常。
这听起来可能有点奇怪,因为我没有任何参考资料提及它,但我能够通过将 DataReader
替换为 DataTable
来解决问题,以读取我的 SP 返回的数据。