Sql server SQL Server数据库连接池?

Sql server SQL Server数据库连接池?,sql-server,vb.net,Sql Server,Vb.net,我在网站上得到了以下例外,它在很大程度上涉及数据输入操作。它还具有在关联数据库中的表上定义的索引。通过SQLHelper进行数据库调用。例如,对于SQLHelper.ExecuteNonQuery()等,我看不到任何地方调用了SQLConnection的Close()或Dispose()方法。因此,我假设SQLHelper必须处理好它,因为我也在各种网站上读到过它。另外,结合Close()或Dispose()检查代码也非常繁琐,因为SQLHelper在许多地方使用,并且有许多类定义了业务逻辑。我

我在网站上得到了以下例外,它在很大程度上涉及数据输入操作。它还具有在关联数据库中的表上定义的索引。通过
SQLHelper
进行数据库调用。例如,对于
SQLHelper.ExecuteNonQuery()
等,我看不到任何地方调用了
SQLConnection
Close()
Dispose()
方法。因此,我假设
SQLHelper
必须处理好它,因为我也在各种网站上读到过它。另外,结合
Close()
Dispose()
检查代码也非常繁琐,因为
SQLHelper
在许多地方使用,并且有许多类定义了业务逻辑。我得到的例外是:

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

目前,我已经在
Global.asax的
Application\u EndRequest
方法中使用put
GC.Collect
对代码进行了测试,到目前为止一切正常。但我知道,严格来说,不建议使用相同的


任何帮助都将不胜感激,因为我被困在这里

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

编辑

关于连接池,默认情况下,.Net本身启用了连接。调用connection.Close()并不意味着您的应用程序与SQL Server之间的连接已真正关闭,它只是将该连接返回到连接池并等待其他人获取。只有在一段时间后没有人打开新连接时,连接才会被物理关闭,因此您不必担心调用connection.Close()的次数太多,相反,您需要尽快调用它以释放资源供其他线程使用

有关更多详细信息,请查看Microsoft如何谈论连接池:

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

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


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

Simon,由于定义业务逻辑的类很多,所以很难在任何地方应用close方法。我还在数据库上运行了SQL Profiler,发现相关的连接确实被重置了,但我不知道为什么它们不可用。我还执行了sproc viz sp_who,发现许多连接确实处于休眠状态,并且它们随着每次数据库调用而不断增加。相反,当我在应用程序_EndRequest中放置GC.Collect()时,我发现休眠连接已消失,并且尽管已达到最大池大小,但错误并未出现。Simon,SQL Helper的版本如下:公共密封类SqlHelper名称:Microsoft.ApplicationBlocks.Data.SqlHelper程序集:Microsoft.ApplicationBlocks.Data,version=1.0.1727.33524.Kunal,我想我们现在可能有点离题了,也许您应该将代码粘贴到这里。顺便说一句,如果您使用的是DataReader,但您没有关闭读卡器,那么您可能也会失去连接。