SQL连接池超时

Cap*_*in0 6 c# ado.net connection-pooling

[免责声明]:我想我已经阅读过关于此的每篇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" };
    }
Run Code Online (Sandbox Code Playgroud)

我使用本地Sql Server时不会发生异常.只有在我连接到"测试服务器"时才会发生.在尝试解决此问题时,还有什么我可以看到的.像Sql server设置/网络设置等.

我调用的存储过程不会锁定我已经检查过的数据库.如果是这种情况,它也应该在我的本地Sql实例上失败.

我使用jmeter生成负载,1500 - 线程(用户).当然,我应该能够处理更多的方式.

提前致谢

Rom*_*ain 4

您尚未指定任何连接超时属性,因此默认值为 15 秒。除非您没有适当的硬件资源,否则使用 Max Pool Size=100 并不是一个好主意。

您启动了 1500 个线程,因此似乎某些线程一直等待 15 秒以获得打开连接的机会。随着时间的推移,您会收到连接超时错误。

因此,我认为增加连接字符串中的“连接超时”属性可能会解决您的问题。