最近项目经常报出黄页,“连接池已满”,让我关注一个问题,检查程序,发现很多使用IDataReader的地方使用完毕后没有关闭,出于方便,我全部使用
using(Reader)
{
Reader.Read()
......
}
来解决,结果进行压力测试的结果并不理想,虽然有缓解,但依然出现“连接池已满”的错误。
大家那位有这样的经验,来讨论一下,这三者的区别?
主要是直接Dispose会不会关闭占用的连接池?难道真的得先用一下Close来关闭吗?
using(Reader)
{
Reader.Read()
......
}
来解决,结果进行压力测试的结果并不理想,虽然有缓解,但依然出现“连接池已满”的错误。
大家那位有这样的经验,来讨论一下,这三者的区别?
主要是直接Dispose会不会关闭占用的连接池?难道真的得先用一下Close来关闭吗?
刚才看了一些文档,SDK中对于SqlConnection.Dispose 方法 的说明里有这样一句话:“Dispose 方法调用 Close,并将 SqlConnection 返回到连接池中。”而上MSDN查了一下IDisposable.Dispose 方法 有一段描述:用户可能期望资源类型使用特定的约定来表示已分配状态和已释放状态。流类即是这样一种示例,传统上认为它们要么打开要么关闭。具有此种约定的类的实施者可能选择实现具有自定义名称(如“Close”)的公用方法来调用 Dispose 方法。看得我头晕。可能是翻译有问题。我看还是先Close掉比较保险!!你们说呢?
{
if (disposing)
{
this.Close();
}
}
在DbDataReader里面你就能看到这样的代码,所以说所有的DataReader在Dispose的时候都调用了Close方法。但,它会不会关闭Connection却不一定。GotDotNet.ApplicationBlocks.Data.dll
你最好看看他的代码……
不过即使写了CommandBehavior.CloseConnection也不能保证Reader会关闭Connection,毕竟这只是一个约定。
另外就是如果并发数很高,同时存在很多个正在执行的Reader,而会导致连接池溢出,如果Read的数据需要很多处理,考虑用DataSet。
就这样吧,结贴,总结一下,养成好习惯,用过Reader一定要先Close然后Dispose。呵呵,感谢大家!随意乱下结论是很危险的。
我没用过ADOHelper , 不过从网上的信息看 应该使用完reader后用ADOHelper把连接关掉