我们正在尝试诊断上周在我们的生产环境中发生的问题。长话短说,数据库连接池似乎充满了来自我们的 ASP.NET 3.5 应用程序的活动连接,即使在重新启动应用程序池和 IIS 后也无法清除这些连接。
资深DBA说因为网络连接发生在操作系统层面,回收app和IIS并没有切断实际的网络连接,所以SQL Server让数据库连接继续运行,我们的app还是无法访问数据库.
在寻找强制重置数据库连接池的方法时,我找到了 static 方法SqlConnection.ClearAllPools()
,文档解释了它的作用,但几乎没有解释何时调用它。似乎在我的 global.asax.cs 的开头Application_Start
和结尾调用它Application_End
是一种很好的安全措施,可以保护应用程序免受中毒连接池的影响,尽管它当然会导致启动/关闭时间的性能下降。
我所描述的是一种好的做法吗?有更好的吗?目标是允许简单的应用重新启动以重置应用的损坏连接池,而无需重新启动操作系统或 SQL Server 服务,这会影响许多其他应用。
非常感谢任何指导。