【发布时间】:2021-09-28 15:43:21
【问题描述】:
一个应用程序在从连接池获取连接之前给出了异常超时期限。我使用了下面的代码,这个代码 sn-p 是从不同的并发用户调用的,并且可以有高达 10000 pr.second 的最大命中。我使用 Dapper 从 Azure MS SQL 数据库中获取结果。
public async Task<List<Results>> GetDBResults(string Id, int skip, int take)
{
var values = new DynamicParameters();
values.Add("Id", Id);
values.Add("Skip", skip);
values.Add("Take", take);
using var connection = GetConnection(AppSettingsProvider.TryGet("ConnectionString"));
try
{
var sw = Stopwatch.StartNew();
//connection.Open();
// QueryAsync is from Dapper
var dbResult = await connection.QueryAsync<ResponseObject>("SP_name", param: values,
commandType: CommandType.StoredProcedure, commandTimeout: Constants.CommandTimeout);
var result= dbResult?.ToList();
Console.WriteLine("execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
return result;
}
finally
{
connection.Close();
}
}
private SqlConnection GetConnection(string connectionString)
{
var sqlConnection = new SqlConnection(connectionString);
return sqlConnection;
}
我知道,“使用”将关闭并释放连接对象,连接正在关闭,但数据库池不能立即用于下一个数据库连接。所以,我在最后一个块中明确关闭了数据库连接。这使我成功地执行了更多并发请求。之后,我收到超时异常。
Connection.Open 由 Dapper 管理,所以代码 sn-p 中没有添加 connection.Open。
并发用户超过 200 次点击后,我们遇到了超时问题。
请告诉我解决此问题的方法。
【问题讨论】:
-
这段代码对我来说看起来很合理。 try/finally 看起来是多余的 - 在这里使用本身应该没问题 - 但是:看起来没什么错误。问题:是否有任何 other 代码打开连接?我想知道这段代码是否是受害者,而不是原因 - 原因是一些没有及时返回连接的other代码。
-
我们没有任何其他打开的数据库连接