浅析SqlConnection的dispose和close方法差异

开发 后端
本文将简单谈谈SqlConnection的dispose和close方法差异和using的使用选择,close和dispose的差异可能大家不是很了解,希望本文给大家一些启示

引用微软ADO.Team的经理的话说,sqlconnection的close和dispose实际是做的同一件事,唯一的区别是Dispose方法清空了connectionString,即设置为了null.

  1. SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg");  
  2.         con.Open();  
  3.         con.Close();  
  4.         con.Open();  
  5.         con.Dispose();  
  6.         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者的选择上是有差异的。

【编辑推荐】

  1. 浅谈ADO.NET中的五个主要对象
  2. 使用LINQ和ADO.NET创建Silverlight程序
  3. ADO.NET中容易混淆的概念
  4. ADO.NET实体框架引发争论
  5. 挖掘ADO.NET Entity框架的性能
责任编辑:彭凡 来源: cnblogs
相关推荐

2009-09-07 09:36:29

C# DisposeDispose方法

2009-09-07 09:53:01

C# DisposeDispose方法

2009-08-31 16:33:28

C#调用Dispose

2009-12-21 16:04:45

WCF Dispose

2011-03-29 14:19:57

Oracle备份

2009-08-21 10:28:21

C#异步方法C#同步方法

2009-09-11 10:59:06

Effective C调用Dispose()

2014-09-11 17:02:41

综合布线

2021-04-21 10:01:53

Python类方法静态方法

2010-11-16 08:48:45

SQL ServerOracle

2021-06-11 10:41:36

大数据安全数据保护数据安全

2022-10-27 16:01:41

AbilityStage模型FA模型

2009-12-31 11:07:33

连接ADO.NET

2019-07-10 10:00:42

PHPPython语法

2009-06-01 08:48:19

作用域变量作用域对象作用域

2009-07-15 10:06:54

Swing实现MDI

2021-02-07 22:59:55

JavaScript编程方法链

2010-04-22 09:52:28

Oracle监听器

2009-07-03 13:22:37

调用Servlet

2009-09-28 10:35:45

Silverlight
点赞
收藏

51CTO技术栈公众号