0

我在网站中遇到以下异常,该异常在很大程度上涉及数据输入操作。它还在相关数据库中的表上定义了索引。数据库调用是通过SQLHelper. 例如SQLHelper.ExecuteNonQuery()等。我看不到调用Close()orDispose()方法的任何地方。SQLConnection所以我假设SQLHelper必须照顾它,因为我也在各个网站上阅读过它。此外,结合Close()或检查代码Dispose()也非常繁琐,因为SQLHelper在许多地方都使用过,并且有许多定义了业务逻辑的类。我得到的例外是:

记录未更新超时。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。

现在我已经通过放入方法测试了代码,GC.Collect到目前为止Application_EndRequest一切Global.asax正常。但我知道严格不建议使用相同的。

任何帮助都将不胜感激,因为我被困在@present..

4

1 回答 1

0

不确定您的 SQLHelper 是哪个版本,但如果您看不到任何 connection.Close() 被调用,那么您需要手动调用它以确保连接关闭。垃圾收集器不会为您关闭连接。

编辑

另外关于连接池,它默认由.Net本身启用,您调用connection.Close()并不意味着您的应用程序与SQL Server之间的连接确实已关闭,它只是将该连接返回到连接池并等待其他人抓住。仅当一段时间后没有人打开新连接时,该连接才会物理关闭,因此您不必担心调用 connection.Close() 太多次,而不是您需要尽快调用它以释放其他资源要使用的线程。

有关更多详细信息,请查看 Microsoft 对连接池的说法:http: //msdn.microsoft.com/en-us/library/8xx3tyca.aspx

另一个编辑 我建议您找到 SQLHelper 的更新版本或继续更改 SQLHelper 以在其中添加 Close()。即使你发现 GC 帮助你关闭了连接但你不应该那样使用它,GC 不是为释放数据库连接而设计的,而只是内存,也不保证 GC.Collect() 会立即执行以启动垃圾收藏。

此外,您正在编写 Web 应用程序,因此您需要考虑并发性,如果在另一个线程运行时调用 GC.Collect() 会降低您的系统对其他用户的速度吗?

那些有限的资源(如数据库连接、TCP/IP 端口、文件读/写处理程序等)需要尽快释放,这是一个常识。如果您正在寻找一种简单的方法来让您在不使用连接的情况下轻松编码。关闭那么您将走向错误的方向,我知道您只想编写代码而不是在任何地方添加该行,但您至少需要确保 SQLHelper做关闭连接的工作。

于 2012-10-19T07:22:47.430 回答