日期:2014-05-18  浏览次数:22073 次

还是关于SqlConnection、SqlConnection要不要手动销毁的问题
很多人都说,SqlConnection要手动Close,我的疑问是:假设没有Close,是不是表示数据库一直在连接着,然后我用OleDbConnection连接了一个Access的数据库,因为Access数据库有没有在连接比较容易区分(会有一个带锁的文件图标存在),网页里没有手动Close,也没Disponse,接着运行程序,在MDB所在的文件夹里没有发现带锁的.ldb文件,我就糊涂了,这到底是代表着过程执行完后系统其实已经销毁了OleDbConnection呢还是.net连接Access数据库跟其它的都不一样不会产生.ldb文件啊?
C#新手虚心求教……

------解决方案--------------------
最好关闭。
------解决方案--------------------
SqlConnection由于实现了IDisposable接口,所以在垃圾回收阶段,会通过Dispose模式调用Close方法,但是这个时间我们是无法确定的,这一切都是由GC来确定的,所以为了保证在其他时候连接没有被占用,用完就关闭是个好习惯。
------解决方案--------------------
一般来说,托管代码申请的内存不需要刻意去释放,局部变量有其存活的周期,脱离了对应的生效的Domain(域),
其资源就会被标记失效,无引用,进入Gen0,下次GC再扫描时,进入Gen1..->Gen2.
最后确定无引用,这部分内存就会被GC彻底回收.

而如果申请的是非托管的内存或者连接资源等,是需要手动释放的.
因为这部分资源不受GC的控制.

就Sqlconnection而言,如果有open,就需要close.

楼主提及的情形可能是超过最大连接时间被中断回收了,这个中断回收可能不是GC做的,
有可能是Microsoft Jet Database Engine内不设定机制回收的.

具体情况需要具体分析,以上是可能被回收的一种情形.
------解决方案--------------------
为了保证在其他时候连接没有被占用,用完就关闭是个好习惯。
------解决方案--------------------
如同一个文件的操作,有open,就有close,数据库在磁盘上也是一种特殊格式的文件,自然就有open和close的动作!文件open后才能对其进行操作,数据库也是一样。
只与“网页里没有手动Close”,好像数据库连接也关闭了,楼上的已经解释很清楚了,如果你还是不清楚,看看MSDN的说明,上面也说得很明白!

------解决方案--------------------
要养成关闭的好习惯
------解决方案--------------------
最好关闭。
------解决方案--------------------
探讨

呵呵,好多星星啊。。。。
“非托管的内存或者连接资源”,是不是比如数据库那端跟连接数有关的这类?
那是不是就表示其实Connection是确实要在这边释放通知数据服务器关闭连接,而类似SqlCommand这些只跟本地资源有关的,交由回收机制处理也不会有大问题?

------解决方案--------------------
最好手动关闭。不能太指望它自动回收。
吃过这方面的亏