ado中dispose和close的区别,摘自网络
Close() and Dispose() are basically the same thing on an ADO.NET connection
object for providers shipped by Microsoft, and typically for 3rd party
providers as well (haven't seen one that does it differently, but you never
know :). The only difference is that Dispose also clears the connection
string. Calling only 1 of them is enough - whichever you prefer or applies
more to your scenario (e.g. C# "using" statement calls Dispose).
--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.
引用微软ADO.Team的经理的话说,sqlconnection的close和dispose实际是做的同一件事,唯一的区别 是Dispose方法清空了connectionString,即设置为了null.
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg");
con.Open();
con.Close();
con.Open();
con.Dispose();
con.Open();
上例运行发现,close掉的connection可以重新open,dispose的不行,因为connectionstring清空了 ,会抛出InvalidOperationException提示The ConnectionString property has not been initialized ,但请注意此时sqlconnection对象还在。
如果dispose后给connectionString重新赋值,则不会报错。
由此得出的结论是不管是dispose还是close都不会销毁对象,即不会释放内存,它们会把 sqlconnection对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是connection timeout设置的 时间内,如果程序中没有向连接池发出请求说要connection对象,sqlconnection对象便会销毁,这也是 连接池存在的意义。
刚开始以为dispose会释放资源清空内存,如果这样的话,连接池不是每次都是要创建新对象,那何来 重用connection呢?在网上看到很多人说close比dispose好,我想真正的原因是dispose后的 sqlconnection对象要重新初始化连接字符串而已,并不是象某些人说的dispose会释放对象。
所以在try..catch和using的选择上大胆的使用using吧,真正的效率差异我想可能只有百万分之一秒 吧(连接池重用该连接对象初始化连接字符串的时间),而且enterprise library中封装的data access 层全是用的using,从代码的美观和效率上综合考虑,using好
补充:using不会捕捉其代码快中的异常,只会最后执行dispose方法,相当于finally{dispose}, 本文主要是想说明dispose和close的差异,因为using是绝对dispose的,可是如果人为的写try..finally 有的人会选择close有的人会选择dispose,实际上在这2者的选择上是有差异的,dispose方法会执行 close方法
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
如有错误,希望高手不吝指正
ado中dispose和close的区别,摘自网络的更多相关文章
- WinForm中Dispose()和Close()的区别
WinForm中Dispose()和Close()的区别 Close()会自动调用Dispose()方法,但是如果窗体是模态的,则不会调用 所以ShowDialog的时候,要用Dispose(),Sh ...
- C#中Dispose,finalize,GC,析构函数区别
释放类所使用的未托管资源的两种方式: 1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销. 2.IDisposable接 ...
- sqlserver 中的GUID 全局唯一标识 -摘自网络
--简单实用全局唯一标识 DECLARE @myid uniqueidentifierSET @myid = NEWID()PRINT 'Value of @myid is: '+ CONVERT(v ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- C++中引用与指针的区别(详细介绍)
C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- .Net 中DataSet和DataTable的 区别与联系
1.简要说明二者关系 在我们编写代码的时候从数据库里取出数据,填充到dataset里,再根据表的名字,实例化到 datatable 中.其实使用 dataset 相当于所使用数据库中数据的副本,保存在 ...
- ADO,OLEDB,ODBC,DAO,RDO的区别说明
http://www.jb51.net/article/31286.htm http://wenku.baidu.com/link?url=D7iis1tmkyXTCqjsezsvYtYHWG8jK- ...
随机推荐
- Python文件传输模块ftplib
ftplib是基于FTP协议实现的一个Python模块 from ftplib import FTP # 创建一个FTP连接对象 ftp = FTP() #[ 当带有参数时,即:ftp = FTP(h ...
- Python十六进制转码问题
使用Python的decode函数转码十六进制的字符串时,会出现UnicodeDecodeError: 'utf8' codec can't decode byte 0xba in position ...
- 【BZOJ4892】DNA(后缀数组)
[BZOJ4892]DNA(后缀数组) 题面 BZOJ 洛谷 题解 看到这道题目,我第一反应是\(FFT\)??? 然后大力码出了一个\(FFT\) 就像这样 #include<iostream ...
- BZOJ1293:[SCOI2009]生日礼物——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1293 https://www.luogu.org/problemnew/show/P2564#sub ...
- 【learning】杜教筛求欧拉函数前缀和
我们考虑利用\(\sum\limits_{d|n}\varphi(d)=n\)这一性质来处理这个问题 设\(f(n)=\sum\limits_{i=1}^{n}\varphi(i)\) 那么我们可以得 ...
- C/C++中二维数组和指针关系分析
在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法.这两者是不同的数据结构.其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组.我猜想是为了表述方便才叫它二 ...
- selenium - 获取断言信息
断言:通过脚本提取相应元素的数值,将实际结果与预期结果进行比较.通常获取title,URL,text等信息进行断言. from selenium import webdriver from time ...
- STL之二:vector容器用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...
- HDU 2655 主席树
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- bzo4802 欧拉函数 miller_rabin pollard_rho
欧拉函数 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 1112 Solved: 418[Submit][Status][Discuss] Descr ...