SQL Server数据库连接池?

时间:2012-10-19 07:19:45

标签: sql-server vb.net

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

  

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

现在我已经测试了代码,并将SQLHelper放在GC.Collect Application_EndRequest方法中,现在一切正常。但我知道严格不建议使用相同的。

任何帮助都会非常感激,因为我被卡住了@ present ..

1 个答案:

答案 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完成工作以关闭连接。