close和dispose的区别
2016-05-05 19:26
218 查看
MSDN中的解释
SqlConnection.Close方法
关闭与数据库之间的连接。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
如果 SqlConnection 超出范围,则不会将其关闭。 因此,必须通过调用Close或Dispose显式关闭该连接。 Close 和 Dispose 的功能等效。 如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。 另一方面,如果 Pooling 设置为 false 或 no,则会关闭到服务器的基础连接。
Component.Dispose方法
释放有Component使用的所有资源使用完 Component 后调用 Dispose。 Dispose 方法使 Component 处于不可用状态。调用完 Dispose 后,必须释放对 Component 的所有引用,这样垃圾回收器才能收回 Component 占用的内存。
Garbage Collection
垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。实践代码
string connStr = @"server=.;database=MyFirstDB;uid=sa;pwd=157326;"; Stopwatch sp = new Stopwatch(); sp.Start(); for (int i = 0; i < 1000000; i++) { SqlConnection conn = new SqlConnection(connStr); conn.Open(); //conn.Close();//00:00:08.3134626 //conn.Dispose();//00:00:08.7635818 } sp.Stop(); Console.WriteLine(sp.Elapsed); Console.ReadKey();
第一次使用close,第二次使用dispose。两者执行时间基本相同。
推论
msdn只说dispose会撤销所有对SqlConnection对象的所有引用,并没有说dispose要销毁SqlConnection对象。即只是告诉GC可以销毁他了。至于什么时候销毁SqlConnection对象,那是GC的事儿了。并且msdn说垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。是最佳时间并不是立即销毁。
close只是关闭了与数据库之间的连接,并没有撤销对SqlConnection对象的引用,所以close后还可以open。而dispose就不可以。
由此得出的结论是不管是dispose还是close都不会销毁对象,即不会释放内存,它们都会把sqlconnection对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是connection timeout设置的时间内,如果程序中没有向连接池发出请求说要connection对象,sqlconnection对象便会销毁,这也是连接池存在的意义。
在查阅资料和多方认证探讨后,基本是这么个结论,如有不同见解,还请多多指教。
PS:stream中的dispose和close是相同的。
参考资料:dispose()与close()的区别 - 凡心不凡 - 博客园
相关文章推荐
- B. Gerald is into Art
- BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)
- 不论学什么专业,都该了解的名词
- Android中线程的正确使用
- Big Event in HDU
- segmented control的使用
- 二分查找算法
- AngularJS所有版本下载地址
- AngularJS所有版本下载地址
- ubuntu install svn server record
- -[UICachedDeviceRGBColor CGImage]: unrecognized selector sent to instance 0x130972b90
- AngularJS所有版本下载地址
- MySQL修改root密码的多种方法
- 使用 python urllib2 抓取网页时出现乱码的解决方案
- iOS 开发CocoaPods的使用
- HDOJ(HDU) 2161 Primes(素数打表)
- HDOJ(HDU) 2161 Primes(素数打表)
- 根据服务端推送过来的数据规则,跳转到对应的控制器(runtime)
- jenkins,Tomcat重启脚本,设置jvm参数之后遇到了一个坑。
- 一个展现java多线程原理的例子