我在 Server 2008 R2 上运行 IIS。最近,我看到了很多这样的错误:
在从池中获取连接之前已超过超时期限。这可能是因为池中的所有连接都已在使用中并且已达到最大池大小。
当我进入 IIS 管理器并查看工作进程时,我发现此应用程序池中有一堆请求,每个请求都已运行了一个多小时。我猜他们正在保留数据库连接,这就是为什么其他人无法获得数据库连接的原因。
因此,有两个问题:
- 为什么 IIS 没有超时并终止这些请求?(它们通常在 1-2 秒内完成。)
- 我如何确保这种情况不会发生?
谢谢!
答案1
IIS 不会建立这些数据库连接,而是您的应用程序会建立。
您需要根据所使用的应用程序框架来解决问题(从外观上看,我猜是带有连接池的.Net) - 我猜您正在泄漏连接,可能是由于没有正确清理(调用 Close 或 Dispose)或有一些忘记清理的奇怪的异常处理代码。
IIS 无法神奇地做到这一点,因为您的应用程序尚未表明它已完成工作 - IIS 不知道数据库是否很慢或者异常处理程序没有正确清理,它只知道它在点 X 启动了一个请求,并且它还没有返回所以它可能仍然很忙。
某些应用程序使用非常长时间的连接,并且对强制终止连接不会做出积极响应。