我有一个有趣的问题正在发生。我最近为一个客户端将 2 个 SQL 数据库迁移到了 SQL Azure,一切似乎都进展顺利……起初。中午时分,我收到了大量关于各种事情的错误电子邮件,但有一些是常见的:
- 数据库的请求限制为 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_offline 文件并将站点关闭了大约半小时,以查看是否有任何挥之不去的连接会断开,但它们没有。我仍然继续收到关于我知道无法访问的页面的错误电子邮件,因为我停止了站点和应用程序池。我在服务器上手动停止 w3wp 进程并运行 SQL KILL 语句来终止连接。他们终于走了!我将应用程序重新上线并点击了一个页面。我一直运行上述查询以查看活动连接,并且每次运行查询时,活动连接数都在不断增加。截至目前,它在 102 点左右停止。然后' 让我作为用户点击单个页面。我猜这不正常?这是否表明连接在那里徘徊并且没有被丢弃或关闭?
我刚刚更改了代码,最近添加了实体框架。无论我在哪里通过 EF 获取数据,我都会在上下文中使用 using 语句。该应用程序的其余部分有点旧,并且正在使用 TableAdapters。我在某些地方看到它与 using 语句遵循相同的模式,而在其他地方则调用 Dispose。我还没有机会追踪所有的用法。这是一个开始寻找的好地方吗?有人对如何追踪这种“泄漏”有任何建议吗?我对 SQL 不是很了解,所以任何帮助都将不胜感激!