asp.net – 在Application_Start和Application_End中调用SqlConnection.ClearAllPools()?

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

高级DBA说,因为网络连接发生在操作系统级别,回收应用程序和IIS没有切断实际的网络连接,所以SQL Server离开数据库连接继续运行,我们的应用程序仍然无法访问数据库.

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

我所描述的是一种好的做法吗?还有更好的吗?目标是允许简单的应用程序重新启动来重置应用程序的错位连接池,而无需重新启动操作系统或SQL Server服务,这将影响许多其他应用程序.

任何指导都非常感谢.

最佳答案 当进程终止时,所有网络连接始终始终始终立即关闭.这是在TCP级别.与ADO.NET无关,适用于所有应用程序.杀死浏览器,所有下载停止.杀死FTP客户端,所有连接立即关闭.

此外,连接池是每个进程.所以在启动应用程序时清除它是没用的,因为池是空的.无需在关机时清除它,因为所有连接都会(正常)关闭.

可能是您的应用没有返回到池的连接.在所有情况下,您必须在使用后丢弃所有连接.如果你没有这样做,悬空连接将无限期累积.

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

查看sys.dm_exec_connections以查看谁正在打开连接.您可以将ADO.NET池大小增加为一种权宜之计. SQL Server每个实例可以接管超过30k的连接.你通常永远不会让它饱和.

点赞