我遇到了一个非常奇怪的问题。我们将 Web Api 2.1 与 Enterprise Library 6 数据块和通过 Unity 的依赖注入一起使用。我开始注意到,如果我经常刷新我们的一个页面,最终我会得到可怕的“超时已过期。在从池中获取连接之前超时时间已过”错误。页面上只有大约 6 个 web api 调用。
大概企业库应该为我处理我的连接,所以我想知道它是否与我们使用 DI 和生命周期管理器有关?我们已经检查了我们的代码,并且我们在所有预期的地方都有“使用”块。
无论如何,我环顾四周所看到的:
检查 Sql Server sysprocesses 显示来自我们站点的连接相当低(最大约为 8)。我偶尔会看到我们的程序名称与空的登录名和 nt_username 字段的连接。我不确定那是关于什么的。这些连接最多可达 20 个,但也往往会很快消失(在几秒钟内)。
但是,检查我们的 Web api 站点的 PerfMon 中 SqlServer 的 .NET 数据提供程序的计数器显示池连接数快速攀升。几次刷新后,上述页面将很快达到 120~ 个连接。回收的连接数在相当长的一段时间内保持为 0。最终,它会在长时间不活动后飙升。我读过这表明连接不正确。
一旦达到 120~ 个池连接,即使 Sql Server 上的连接被放弃,api 站点将永远返回 500 个错误和连接池错误,这发生在 IIS 显示任何回收的连接之前。Sql Server 可能在 5 分钟不活动后放弃,而 IIS 将在 30 分钟后放弃。