我遇到过这样一种情况:应用程序随着时间的推移从几个应用服务器向 32 位 SQL2005 SP2 后端累计打开了 6000 多个连接,最终导致内部内存压力(dll 从 mem2leave 区域卸载,同时应用程序崩溃)。我认为应用程序有问题(未正确关闭连接)。我把这个问题抛给了应用程序人员,但他认为问题可能出在 SQL 服务器上,因为它没有发生在类似的 UAT 环境中。关于我在 SQL 方面可以做什么,有什么建议吗?我考虑过增加 mem2leave 区域,但担心这只会延迟/掩盖真正的问题。
答案1
当垃圾收集器在应用服务器上运行时,.NET 应用应该自行清理。这应该每隔几分钟自动运行一次。
您能否查询 SQL Server 并查看这些连接在 SQL Server 上是否仍然打开?
如果您在应用服务器上运行 netstat,您能看到所有套接字连接都打开了吗?(SQL Server 上使用的每个 spid 都会在应用服务器上有一个套接字连接。)
如果您确实看到应用服务器上所有端口都在使用中,那么应用服务器肯定不会关闭连接,因为除非收到请求,否则 SQL 不会关闭连接。.NET 代码可能希望这会自动发生,但事实并非如此。您的测试环境中可能没有这个问题,因为使用率要低得多,而且您可能更频繁地发布到测试环境,这会导致 IIS 重新启动时所有端口都关闭。
对我来说这绝对听起来像是应用程序代码问题。
答案2
听起来应用程序没有使用连接池。这可能会导致您所描述的问题。您可以调整操作系统的一些 TCP/IP 设置。以下知识库文章对此进行了描述:
答案3
当你使用完连接后,你要关闭连接,对吗?
另外,请查看应用程序池设置。当它回收时,连接将会断开。