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。如果大家能在这微软团队写的代码里多改进、扩展,就是一种提高。