我有一个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
}
大多数情况下,我使用它的无参数构造函数来获取配置文件中带有默认连接字符串的db实例。 以下是我在代码中执行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个进程处于Sleep状态,并带有AWAITING
命令。但是在我的代码中,我现在正在明确地进行connection.Close()
。
我认为问题在于AWS RDS没有重用池中的连接。当我连接到我的本地数据库时运行相同的代码,它工作正常。
答案 0 :(得分:0)
这可能听起来有点奇怪,因为我没有任何提及它的引用,但我能够通过DataReader
替换DataTable
以读取我的SP返回的数据。