Close()、Dispose()和using()

sunsun_true 2006-12-21 03:51:52
最近项目经常报出黄页,“连接池已满。。。。。。”,让我关注一个问题,检查程序,发现很多使用IDataReader的地方使用完毕后没有关闭,出于方便,我全部使用
using(Reader)
{
Reader.Read()
......
}
来解决,结果进行压力测试的结果并不理想,虽然有缓解,但依然出现“连接池已满”的错误。
大家那位有这样的经验,来讨论一下,这三者的区别?
主要是直接Dispose会不会关闭占用的连接池?难道真的得先用一下Close来关闭吗?
...全文
307 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vitotti 2006-12-21
  • 打赏
  • 举报
回复
ADOHelper .executereader ?
我没用过ADOHelper , 不过从网上的信息看 应该使用完reader后用ADOHelper把连接关掉
Ivony 2006-12-21
  • 打赏
  • 举报
回复

就这样吧,结贴,总结一下,养成好习惯,用过Reader一定要先Close然后Dispose。呵呵,感谢大家!



随意乱下结论是很危险的。
Ivony 2006-12-21
  • 打赏
  • 举报
回复
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
this.Close();
}
}


在DbDataReader里面你就能看到这样的代码,所以说所有的DataReader在Dispose的时候都调用了Close方法。

但,它会不会关闭Connection却不一定。



GotDotNet.ApplicationBlocks.Data.dll
你最好看看他的代码……


不过即使写了CommandBehavior.CloseConnection也不能保证Reader会关闭Connection,毕竟这只是一个约定。
另外就是如果并发数很高,同时存在很多个正在执行的Reader,而会导致连接池溢出,如果Read的数据需要很多处理,考虑用DataSet。
sunsun_true 2006-12-21
  • 打赏
  • 举报
回复
就这样吧,结贴,总结一下,养成好习惯,用过Reader一定要先Close然后Dispose。呵呵,感谢大家!
yibin2006 2006-12-21
  • 打赏
  • 举报
回复
用using(......){}
sunsun_true 2006-12-21
  • 打赏
  • 举报
回复
不是啦,我数据处理用的是GotDotNet.ApplicationBlocks.Data.dll,Connection的关闭到不用我关心。
刚才看了一些文档,SDK中对于SqlConnection.Dispose 方法 的说明里有这样一句话:

“Dispose 方法调用 Close,并将 SqlConnection 返回到连接池中。”

而上MSDN查了一下IDisposable.Dispose 方法 有一段描述:

用户可能期望资源类型使用特定的约定来表示已分配状态和已释放状态。流类即是这样一种示例,传统上认为它们要么打开要么关闭。具有此种约定的类的实施者可能选择实现具有自定义名称(如“Close”)的公用方法来调用 Dispose 方法。

看得我头晕。可能是翻译有问题。我看还是先Close掉比较保险!!你们说呢?
Ivony 2006-12-21
  • 打赏
  • 举报
回复
你关闭了Reader,但Connection关没?!

在创建Reader的时候加个参数:

command.ExecuteReader ( CommandBehavior.CloseConnection )
lxsfg 2006-12-21
  • 打赏
  • 举报
回复
using 是Dispose 并没有Close 这一点千万注意,Dispose并不能关闭Reader,直接调用Dispose而不Close的话,数据库并不知道连接对象已经销毁,而数据库依然是连接状态,所以Dispose前一定要先Close
Eddie005 2006-12-21
  • 打赏
  • 举报
回复
IDataConnection 不等同于 数据库中的理解对象

Dispose只释放了.net运行时内存中的DataConnection对象,而数据库中的连接还没有关闭
Eddie005 2006-12-21
  • 打赏
  • 举报
回复
一定要Close()

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧