我得到了以下例外,在网站上,必须在很大程度上处理数据输入操作。它还在关联数据库中的表上定义了索引。数据库调用是通过SQLHelper进行的。例如,SQLHelper.ExecuteNonQuery()等,我看不到调用SQLConnection的Close()或Dispose()方法的任何地方。所以我假设SQLHelper一定在处理它,因为我也在不同的网站上读到过它。此外,结合Close()或Dispose()检查代码也非常繁琐,因为在许多地方都使用SQLHelper,而且有许多类定义了业务逻辑。我得到的例外是:
记录未被更新超时过期。从池获得连接之前经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。
目前,我已经测试了将GC.Collect放在Global.asax的Application_EndRequest方法中的代码,到目前为止,一切都很好。但我知道这是严格不建议使用相同的。
任何帮助都会受到极大的感谢,因为我被困在“礼物”上。
发布于 2012-10-19 07:22:47
不确定SQLHelper的哪个版本,但如果看不到调用任何connection.Close(),则需要手动调用它以确保连接关闭。垃圾收集器不会为您关闭连接。
编辑
另外,关于.Net本身默认启用的连接池,您调用connection.Close()并不意味着您的应用程序到Server的连接实际上已经关闭,它只是将该连接返回到连接池并等待其他人获取。只有在过了一段时间没有人打开新连接时,连接才会被物理关闭,所以您不需要担心调用connection.Close()太多次,而需要尽快调用它以释放资源供其他线程使用。
有关更多细节,请查看Microsoft如何表示连接池:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
另一个编辑,我建议您找到SQLHelper的更新版本,或者继续修改SQLHelper,在其中添加Close()。即使您发现GC帮助您关闭了连接,但您不应该以这种方式使用它,GC不是为释放数据库连接而设计的,而只是内存,而且也不能保证GC.Collect()会立即执行它来启动垃圾收集。
另外,您正在编写web应用程序,因此需要考虑并发性,如果在运行另一个线程时调用GC.Collect(),会不会降低系统对其他用户的速度?
众所周知,这些有限的资源(如db连接、TCP/IP端口、文件读/写处理程序等)需要尽快释放。如果您正在寻找一种简单的方法,使您在不使用connection.Close的情况下轻松编码,那么您就走错了方向,我知道您只想编写代码,而不是在任何地方添加这一行,但是您至少需要确保SQLHelper完成工作来关闭连接。
https://stackoverflow.com/questions/12969244
复制相似问题