Code Bye

DbConnection Close还是Dispose

在操作数据库后,调用Close和Dispose有什么区别?
说明:
1.  网上有许多人说Dispose后,就不能再Open。
Dispose后,只要重新为ConnnectionString赋值,依然可以Open。
2. 在Pooling为false时(禁止使用连接池),Close和Dispose都会关闭连接;而在Pooling为true(允许使用连接池)时,有人说Close不会关闭连接,会将连接扔回连接池;而Dispose会关闭连接。
前部分说得对;但通过测试,Pooling为true时,即使调用Dispose,连接依然只是放回连接池,不会关闭。通过sql profiler可以观察到这个过程。
msdn说两者在功能上是等效的。高手们发表看法。
解决方案:5分
期实没区别
Dispose 里面也会调用到Close的
Connection内部还有SqlInternalConnectionTds; 你Dispose 把这个给NULL+ 调用Close方法
解决方案:5分
一样的,msdn上说的很明确了
If the DbConnection goes out of scope, it is not closed.Therefore, you must explicitly close the connection by calling Close or Dispose, which are functionally equivalent.
解决方案:10分
功能上本来就是等效的,稍微去看下源代码就知道了,Dispose是出于IDispose接口规范的考虑。Open和Close则是语义上的方法对,有开有关。
这个开和关是逻辑功能上的,不是基础连接(Socket或管道),池模式两种都会放回基础连接池
解决方案:10分
using 语句段结束时,会隐式的调用 Dispose。自然也关闭了到数据库的连接
Dispose 的作用是释放被占用的资源
当使用连接池时,连接池的管理由第三方实现,与当前程序无关
此时连接明确的分为:
应用程序到连接池的连接(Dispose,Close 关闭的都是这个)
连接池到数据库服务器的连接
不使用连接池时(将客户端融入应用程序)
连接分为:
数据库服务器的物理连接(tcp/ip)
数据库的逻辑连接
短连接两者都关闭,长连接只关闭后者
LZ的疑惑只是在于:将两个独立的实体,联在一起考虑了
解决方案:10分
本人觉得吧,本人试图用GC来解释dispose和close后的行为是不恰当的。实际上我们讨论的是当一个dbconnection执行了dispose或close,这个实例的状态!前提当然是这个实例仍然有效。weakreference过于玄幻,我们不讨论。
不翻源码,单从函数设计角度来说,顾名思义,dispose means dropping something into the trash; close, however, implies that it””s possible to reopen。dispose后,dbconnection对象的状态应该为不可用;close后,对象状态为可用,尽管dbconnect的innerconnection成员变量的状态为不可用。所以,也许可以通过reopen来重新establish innerconnetion。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明DbConnection Close还是Dispose