5

考虑一个存在连接池内存泄漏问题的 ASP.NET 应用程序(例如,连接未正确关闭)。

回收应用程序池是否会清除连接池(从而允许建立更多连接)?

如果连接保留在内存中,直到垃圾收集器将它们删除,当应用程序池重新启动时是否会发生这种情况(或者它们是否/可以超出此范围)?我也知道垃圾收集器也可以随时清理它们,但是它们是否仍在使用中并且在重置或应用程序池重新启动之前无法收集?

我正在审查一个系统,其最终目标显然是更正代码以正确管理连接,并且我试图更多地了解垃圾收集/应用程序池过程。

4

2 回答 2

7

是的,回收应用程序池会杀死并重新启动负责运行您的应用程序的 IIS 进程。此时所有资源都被释放,仅仅是因为进程正在退出。

如果进程从未重新启动并且只是泄漏句柄,垃圾收集器最终会清理它们。但是,在这种情况发生之前,您可能会用完任何资源泄漏的句柄。这就是为什么在这些对象上调用 Dispose() 很重要(最好通过“使用”模式),以便在应用程序完成它们后立即释放资源,而不是在垃圾收集器处理它时释放资源。

于 2009-07-20T07:09:39.007 回答
2

连接池是数据库连接的缓存。应用程序池是一个(或多个)工作进程。因此,当您关闭应用程序池时,您将关闭您的工作进程并启动新的工作进程;这将导致池被破坏并且连接池中的所有连接都被关闭。

如果您不对连接调用 Close 或 Dispose 并依赖垃圾收集器,则连接可能会或可能不会返回到池中。我认为只有在连接仍然有效并且达到最大池大小时才会将其添加回池中。您可能知道,您永远不应该依赖垃圾收集器。确保连接被 Disposed 的一种简单方法是使用 using 语句,该语句将在代码块末尾自动调用 Dispose。

在 ADO.NET 2.0 中有以编程方式管理池的新方法:ClearAllPools 和 ClearPool。在您修复所有数据访问代码之前,这可能会帮助您解决问题。

于 2009-07-20T07:25:54.873 回答