在操作数据库后,调用Close和Dispose有什么区别?
说明:
1. 网上有许多人说Dispose后,就不能再Open。
Dispose后,只要重新为ConnnectionString赋值,依然可以Open。
2. 在Pooling为false时(禁止使用连接池),Close和Dispose都会关闭连接;而在Pooling为true(允许使用连接池)时,有人说Close不会关闭连接,会将连接扔回连接池;而Dispose会关闭连接。
前部分说得对;但通过测试,Pooling为true时,即使调用Dispose,连接依然只是放回连接池,不会关闭。通过sql profiler可以观察到这个过程。
msdn说两者在功能上是等效的。高手们发表看法。
说明:
1. 网上有许多人说Dispose后,就不能再Open。
Dispose后,只要重新为ConnnectionString赋值,依然可以Open。
2. 在Pooling为false时(禁止使用连接池),Close和Dispose都会关闭连接;而在Pooling为true(允许使用连接池)时,有人说Close不会关闭连接,会将连接扔回连接池;而Dispose会关闭连接。
前部分说得对;但通过测试,Pooling为true时,即使调用Dispose,连接依然只是放回连接池,不会关闭。通过sql profiler可以观察到这个过程。
msdn说两者在功能上是等效的。高手们发表看法。
解决方案:5分
解决方案:5分
解决方案:10分
功能上本来就是等效的,稍微去看下源代码就知道了,Dispose是出于IDispose接口规范的考虑。Open和Close则是语义上的方法对,有开有关。
这个开和关是逻辑功能上的,不是基础连接(Socket或管道),池模式两种都会放回基础连接池中
这个开和关是逻辑功能上的,不是基础连接(Socket或管道),池模式两种都会放回基础连接池中
解决方案:10分
解决方案: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。
不翻源码,单从函数设计角度来说,顾名思义,dispose means dropping something into the trash; close, however, implies that it””s possible to reopen。dispose后,dbconnection对象的状态应该为不可用;close后,对象状态为可用,尽管dbconnect的innerconnection成员变量的状态为不可用。所以,也许可以通过reopen来重新establish innerconnetion。