我有一个.net mvc / sql server网站,用于高流量应用程序。我正在使用异步数据库连接。
在发布之前,我进行了负载测试,在负载下它很快就爆炸了。连接池快速耗尽连接。
在数据库级别运行sp_who会显示一堆正在等待命令的连接。如果我切换到非异步,则不会发生这种情况。
因此,新数据库调用似乎没有使用连接池中的连接,而是打开自己的新连接。这很快就会耗尽连接池限制,并开始超时查询。
以下是我用来执行异步datareader的帮助程序。有没有人在这看到任何问题?
private async Task<List<T>> ExecuteReaderAsync<T>(SqlCommand command, Func<SqlDataReader, T> rowConverter)
{
List<T> ret = new List<T>();
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
command.Connection = connection;
await connection.OpenAsync();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
ret.Add(rowConverter(reader));
}
reader.Close();
}
connection.Close();
}
return ret;
}
我像下面这样调用像datareader帮助器一样的代码:
public async Task<Content> FindContentAsync(int id)
{
Content content = null;
using (SqlCommand command = CreateProcedure("dbo.FindContent"))
{
AddParam(command, "Id", SqlDbType.Int, id);
List<Content> items = await ExecuteReaderAsync<Content>(command, x => BindContent(x));
if (items.Count > 0)
{
content = items[0];
}
}
return content;
}
从帮助者那里打电话:
public async Task<Content> FindAsync(int id)
{
var db = new DataAccess();
var content = await db.FindContentAsync(id);
return content;
}