[免责声明]:我想我已经阅读了关于此已经发布的所有stackoverflow帖子
我已经打破了这个问题很长一段时间了。我在asp.net web.api中遇到以下异常。
抛出异常:mscorlib.dll中的'System.InvalidOperationException'
其他信息:超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
大多数人建议我应该在我的应用程序中查找泄露的连接。这是我的代码。现在我确信我没有泄露任何连接
public async Task<IEnumerable<string>> Get()
{
var ds = new DataSet();
var constring = "Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;Max Pool Size=100";
var asyncConnectionString = new SqlConnectionStringBuilder(constring)
{
AsynchronousProcessing = true
}.ToString();
using (var con = new SqlConnection(asyncConnectionString))
using (var cmd = new SqlCommand("[dbo].[xxx]", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@x1", 1);
cmd.Parameters.AddWithValue("@x2", "something");
await con.OpenAsync();
using (var rdr =await cmd.ExecuteReaderAsync())
{
if (rdr.HasRows)
{
ds.Load(rdr, LoadOption.OverwriteChanges, "MyTable");
}
rdr.Close();
con.Close();
ds.Dispose();
}
}
//I know this looks wrong, just an empty api method to show the code
return new string[] { "value1", "value2" };
}
当我使用本地Sql Server时,不会发生异常。只有在我连接到“测试服务器”时才会发生。在尝试解决此问题时,还有什么我可以看到的。像Sql server设置/网络设置等。
我调用的存储过程不会锁定我已经检查过的数据库。如果是这种情况,它本应在我的本地Sql实例上失败。
我使用jmeter生成负载,1500 - 线程(用户)。当然,我应该能够处理更多的事情。
提前致谢
答案 0 :(得分:0)
您尚未指定任何“连接超时”属性,因此默认值为15秒。除非您没有适当的硬件资源,否则使用“最大池大小” = 100并不是一个好主意。
您启动了1500个线程,因此似乎某些线程一直等待15秒才能获得打开连接的机会。随着时间的流逝,您会收到连接超时错误。
所以我认为增加连接字符串中的'Connection Timeout'属性可以解决您的问题。