谈谈DbConnection的Close()和Dispose()----很不错,关键是开阔了视野

MSDN    DbConnection.Dispose() 释放对象占用的托管和非托管资源。
DbConnection.Close()会回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接,这是关闭任何打开连接的首选方法。

 

所有的开发者都知道打开的数据连接应该在SqlCommand或Procedure执行结束以后,或者DataReader读取数据结束以后,就应该马上手动关闭,即使是使用的DataAdapter也应该这样,比如下面的代码

 

//.............    

if (connection.State == ConnectionState.Open)

connection.Close();        

 

 

 

 

 

但是DbConnection提供了Dispose()方法,同样也能关闭数据连接,于是许多人就会使用Dispose()而不使用Close()。这大概是因为Dispose()还担负了释放managed和unmanaged所有资源的重任。

ADO.NET的DbConnection是一个COM+组件,这意味着它有COM+目录的额外开销,

及早的注销这个组件或许是个好办法,于是我在一些Blog和开源Enterprise Application里找到类似下面这样的代码

 

// Microsoft Data Access Application Block for .NET

public abstract class SqlHelper

{

//.............

public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

  {

            SqlCommand cmd = new SqlCommand();

            using (SqlConnection conn = new SqlConnection(connectionString))

 {

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

                int val = cmd.ExecuteNonQuery();

                cmd.Parameters.Clear();

                return val;

            }

  }

//.............

}

 

上面的代码是微软一个.NET开发小组写的DAL Demo其中一个方法,其实这个Demo经历了4次更新换代,代码不断“瘦身”,功能好象是缩减了,其实非常的轻盈、好用,可以直接用在任何Application的数据访问层的最低层的数据访问功能模块,推荐大家下载阅读、使用。

       我曾担心的认为,Dispose方法会释放对象使用的非托管资源,那么从连接池里取出的数据连接呢?它会不会被释放掉呢?

       带着这个疑问,我打开了Reflector看个究竟。

 

//SqlConnection实现的IDispose Methods

public void Dispose()
{
      this.Dispose(true);
      GC.SuppressFinalize(this);

}

protected override void Dispose(bool disposing)
{
      if (disposing)
      {
            this._userConnectionOptions = null;
            this._poolGroup = null;
            this.Close();
      }
      this.DisposeMe(disposing);
      base.Dispose(disposing);

}

private void DisposeMe(bool disposing)
{

}

 

      

       让我高兴的是,Dispose方法并不会释放掉池连接,而是默认执行Close方法。不同的是,它还会执行私有的DisposeMe(bool)和父类的Dispose(bool)方法。SqlConnection的父类是DbConnection,但DbConnection并没有继承IDispose接口,而是DbConnection的父类Component实现了IDispose,所以SqlConnection执行的Base.Dispose(true)实际是释放它的非托管资源。令人感到不可思议的是DisposeMe(bool)方法,居然是一个空的私有方法!是.NET开发者跟我们开的一个小小的玩笑吗?

       最后,推荐大家下载Microsoft Data Access Application Block for .NET来看看,目前最新版本就是基于.NET 1.1的 Version3.0和基于.NET 2.0的Version4.0。如果大家能在这微软团队写的代码里多改进、扩展,就是一种提高。

       工具Reflector也是应用广泛的开发辅助工具,它可以帮助我们查看已编译的.NET程序集的代码,甚至是.NET Framework类库。但是用混淆器编译的就有点麻烦了。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值