本文介绍了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个连接都处于
sleeping
和awaiting 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池连接无法重复使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!