ADO.NET池连接无法重复使用 [英] ADO.NET Pooled connections are unable to reuse

查看:3
本文介绍了ADO.NET池连接无法重复使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

System.Data.Entity.Core.EntityException:基础提供程序 打开时失败。->System.InvalidOperationException:超时 过期了。在获得连接之前已经过超时时间 从泳池里。这可能是由于所有池连接导致的 正在使用中,并且已达到最大池大小。

大多数情况下,应用程序的平均活跃连接数在10到20之间。任何负载都不会改变这个数字...事件当负载较高时,它保持在级别10-20。但在某些情况下,在不到一分钟的时间内,它可能只会达到100个,而没有任何提升时间,这会导致当我所有的请求都失败时,应用程序处于状态。所有这100个连接都处于sleepingawaiting command状态。

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

最糟糕的是,我仍然不知道根本原因。

澄清一下,应用程序负载是指每分钟产生1000个请求的200-300个并发用户

建议@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足够聪明,可以在需要时懒惰地创建连接(使用提供的函数),并在使用时将其释放?

推荐答案

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

这里有一个帮助器库,您可以使用它来跟踪连接泄漏的时间,并报告最初打开连接的调用站点。

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

这篇关于ADO.NET池连接无法重复使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆