Sql server SQL Azure请求限制和可能的连接泄漏

Sql server SQL Azure请求限制和可能的连接泄漏,sql-server,entity-framework,azure,connection-leaks,Sql Server,Entity Framework,Azure,Connection Leaks,我有一个有趣的问题。我最近为一个客户机将2个SQL数据库移动到了SQLAzure,起初一切似乎都进展顺利。上午12点左右,我收到了大量关于各种事情的错误电子邮件,但有一些常见的: -数据库的请求限制为90,已达到。 -超时已过期。操作完成前的超时时间或服务器没有响应。 -从服务器接收结果时发生传输级别错误 迁移到Azure或现有代码时,显然存在一些与数据库相关的问题。似乎发生最多的错误是请求限制和超时。一旦开始,他们似乎从未停止过。我认为现在没有多少用户使用这个网站。如果这样做有意义的话,连接似

我有一个有趣的问题。我最近为一个客户机将2个SQL数据库移动到了SQLAzure,起初一切似乎都进展顺利。上午12点左右,我收到了大量关于各种事情的错误电子邮件,但有一些常见的:

-数据库的请求限制为90,已达到。
-超时已过期。操作完成前的超时时间或服务器没有响应。
-从服务器接收结果时发生传输级别错误

迁移到Azure或现有代码时,显然存在一些与数据库相关的问题。似乎发生最多的错误是请求限制和超时。一旦开始,他们似乎从未停止过。我认为现在没有多少用户使用这个网站。如果这样做有意义的话,连接似乎继续尝试在后台的另一个线程上连接。这是指“操作完成前的超时时间或服务器没有响应”。我会收到一封错误电子邮件,我会检查它引用的页面,它会立即加载。我与抛出错误的用户进行了检查,他们报告一切正常。奇怪。然而,我每隔几分钟就会收到同样的错误电子邮件

我目前将它们放在S1层,这将请求限制为同时90个。我进行了一些挖掘,发现了以下SQL查询:

select * from sys.dm_exec_connections
我运行了这个,它显示我有超过90个活跃的连接,其中一些是前一段时间打开的。这对我来说很奇怪,因为该网站目前没有被使用(现在已经很晚了,我知道没有人在使用该网站)。我想结束所有连接,因此我提出了以下查询:

DECLARE @sessionId int
DECLARE @SQL nvarchar(1000)
DECLARE @clientIP nvarchar(50)

set @clientIP = 'XX.XX.XX.XX'

select @sessionId = min( session_id ) from sys.dm_exec_connections where   client_net_address = @clientIP

while @sessionId is not null
begin
    SET @SQL = 'KILL ' + CAST(@sessionId as varchar(4))
    EXEC (@SQL)
    select @sessionId = min( session_id ) from sys.dm_exec_connections where session_id > @sessionId and client_net_address = @clientIP
end
我尝试运行此命令,但连接立即恢复。我在web服务器上手动停止IIS中的站点,再次运行KILL命令,但连接仍然存在。我把app_的离线文件放到网上,把网站关闭了大约半个小时,看看是否有延迟的连接会断开,但他们没有。我仍然不断收到错误邮件,因为我知道由于我停止了网站和应用程序池而无法访问这些页面。我在服务器上手动停止w3wp进程,并运行sqlkill语句来终止连接。他们终于走了!我将应用程序重新联机并点击一个页面。我一直在运行上面的查询以查看活动连接,并且可以肯定的是,每次运行查询时,活动连接数都在不断增加。到目前为止,它停在102左右。这就是我作为一个只点击一个页面的用户。我猜这不正常吧?这是否表明连接在那里徘徊,没有被断开或关闭


我最近刚刚修改了代码,添加了实体框架。无论我在哪里通过EF获取数据,我都会在上下文中使用so和using语句。该应用程序的其余部分有点陈旧,正在使用TableAdapters。我看到在某些地方,它使用语句时遵循相同的模式,而在其他地方调用了Dispose。我还没有机会找到所有的用法。这是开始寻找的好地方吗?有人对如何追踪这个“泄露”有什么建议吗?我对SQL不是非常了解,所以非常感谢您的帮助

我很感激你花了这么多时间来写这个问题,但是你有没有可能把它缩短一点?也许是四分之一的大小?Fwiw,我认为你提供了一个极好的细节:)我正在努力寻找导致这一点的原因,除了自动重试的东西。可能是一条语句现在在Azure上运行时间太长,并且会自动重试?您可以在Azure中启用审核以查看所有语句和执行时间。问题可能不是你遇到的错误。我确实实现了SqlAzureExecutionStrategy,它在放弃连接之前自动重试一定次数。也许这已经成为流氓了。@Enigmativity-抱歉提供了太多细节。我想,如果我能准确地解释发生了什么,比我知识渊博的人会发现一个常见问题。Eric,如果我是你,我会对你的数据库启用SQL审计。它应该能够向您显示任何大的或重复的SQL语句。或者看看DMV,尽管我怀疑审计会更容易解释。