ADO.NET池连接无法重用

时间:2017-01-28 20:44:10

标签: sql asp.net entity-framework owin connection-pooling

我正在使用一个ASP.NET MVC应用程序,它使用EF 6.x来处理我的Azure SDL数据库。最近随着负载增加,应用程序开始进入无法再与SQL服务器通信的状态。我可以看到使用exec sp_who有100个活动连接到我的数据库,并且无法使用以下错误创建任何新连接:

  

System.Data.Entity.Core.EntityException:基础提供程序   打开失败。 ---> System.InvalidOperationException:超时   过期。在获得连接之前经过了超时时间   从游泳池。这可能是因为所有池化连接而发生的   正在使用,达到最大池大小。

大多数时候,app的平均活动连接数从10到20不变。任何负载都不会改变这个数字......当负载很高时,它会保持在10-20级。但在某些情况下,它可能在不到一分钟的时间内达到100而没有任何加速时间,这会在我的所有请求都失败时导致应用程序状态。所有这100个连接都处于sleeping状态和awaiting command

好的部分是我找到了一个解决方法,帮助我缓解了问题 - 从客户端清除连接池。我正在使用SqlCoonection.ClearAllPools()并立即关闭所有连接,sp_who显示我之后的常规10-20连接。

不好的部分,我仍然不知道根本原因。

只是为了澄清应用加载大约是200-300并发用户,每分钟生成1000个请求

有了很好的建议@DavidBrowne用简单的模式跟踪泄漏的连接,我能够在配置Owin引擎时发现泄漏的连接

private void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
    // here in create method I'm creating also a connection leak tracker
    app.CreatePerOwinContext(() => MyCoolDb.Create());
    ...
}

基本上对于每个请求,Owin都会创建一个连接并且不会让它继续,当WebAPI负载增加时我会遇到麻烦。

这可能是真正的原因吗?我Owin足够聪明,可以在需要时(使用提供的功能)延迟创建连接,并在使用它时放手?

1 个答案:

答案 0 :(得分:1)

非常不可能这是由应用程序代码泄漏连接以外的任何其他原因引起的。

这是一个帮助程序库,可用于跟踪连接何时泄露,并报告最初打开连接的呼叫站点。

http://ssbwcf.codeplex.com/SourceControl/latest#SsbTransportChannel/SqlConnectionLifetimeTracker.cs