我在网站上遇到以下异常,这在很大程度上涉及数据输入操作。它还在相关数据库的表中定义了索引。数据库调用是通过SQLHelper
进行的。对于例如SQLHelper.ExecuteNonQuery()
等。我无法在任何地方看到调用Close()
的{{1}}或Dispose()
方法。所以我假设SQLConnection
必须照顾它,因为我也在各个网站上阅读过它。此外,与SQLHelper
或Close()
组合检查代码也非常繁琐,因为在许多地方使用了Dispose()
,并且有许多类定义了业务逻辑。我得到的例外是:
记录未更新超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
现在我已经测试了代码,并将SQLHelper
放在GC.Collect
Application_EndRequest
方法中,现在一切正常。但我知道严格不建议使用相同的。
任何帮助都会非常感激,因为我被卡住了@ present ..
答案 0 :(得分:0)
不确定您的SQLHelper的版本是什么,但如果您看不到任何连接。已调用Close(),则需要手动调用它以确保连接已关闭。垃圾收集器不会为您关闭连接。
修改强>
关于默认由.Net本身启用的连接池,你调用connection.Close()并不意味着你的应用程序与SQL Server之间的连接确实已经关闭,它只是将该连接返回到连接池并等待为了别人抢。只有在一段时间之后没有人打开新连接,连接它们将被物理关闭,所以你不必担心呼叫连接。关闭()太多次,而不是你需要调用它asap来释放其他资源要使用的线程。
有关详细信息,请查看Microsoft如何评论连接池:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
另一个编辑 我建议您找到SQLHelper的更新版本,或者继续更改SQLHelper以在其中添加Close()。即使您发现GC帮助您关闭连接但不应该以这种方式使用它,GC不是为发布数据库连接而设计的,只是内存,也不保证GC.Collect()会立即立即执行它以启动垃圾采集。
此外,您正在对Web应用程序进行编码,因此您需要考虑并发性,如果在另一个线程运行时调用GC.Collect(),会不会将系统放慢到其他用户?
常识是这些有限的资源(如数据库连接,TCP / IP端口,文件读/写处理程序等)需要尽快发布。如果你正在寻找一种简单的方法来让你轻松编码而不使用连接。关闭然后你会走错方向,我明白你只想要代码而不是在任何地方添加该行但你至少需要确保SQLHelper完成工作以关闭连接。