4

我们正在尝试诊断上周在我们的生产环境中发生的问题。长话短说,数据库连接池似乎充满了来自我们的 ASP.NET 3.5 应用程序的活动连接,即使在重新启动应用程序池和 IIS 后也无法清除这些连接。

资深DBA说因为网络连接发生在操作系统层面,回收app和IIS并没有切断实际的网络连接,所以SQL Server让数据库连接继续运行,我们的app还是无法访问数据库.

在寻找强制重置数据库连接池的方法时,我找到了 static 方法SqlConnection.ClearAllPools(),文档解释了它的作用,但几乎没有解释何时调用它。似乎在我的 global.asax.cs 的开头Application_Start和结尾调用它Application_End是一种很好的安全措施,可以保护应用程序免受中毒连接池的影响,尽管它当然会导致启动/关闭时间的性能下降。

我所描述的是一种好的做法吗?有更好的吗?目标是允许简单的应用重新启动以重置应用的损坏连接池,而无需重新启动操作系统或 SQL Server 服务,这会影响许多其他应用。

非常感谢任何指导。

4

1 回答 1

2

当一个进程死亡时,所有的网络连接总是,总是,总是立即关闭。那是在 TCP 级别。与 ADO.NET 无关,适用于所有应用程序。杀死浏览器,所有下载都停止。杀死 FTP 客户端并立即关闭所有连接。

此外,连接池是每个进程的。所以在启动应用程序时清除它是没有用的,因为池是空的。没有必要在关机时清除它,因为所有连接都会(优雅地)随时关闭。

可能,您的应用程序没有返回到池的连接。在所有情况下,您必须在使用后处理所有连接。如果你不这样做,悬空连接将无限期地累积。

清除池并不会释放悬空连接,因为它们似乎正在使用中。ADO.NET 怎么会告诉你永远不会再使用它们呢?它不能。

查看sys.dm_exec_connections谁在保持连接打开。您可能会增加 ADO.NET 池大小作为权宜之计。SQL Server 每个实例可以接管超过 30k 个连接。你通常永远不会饱和。

于 2013-09-25T23:05:36.693 回答