平时我们书上讲的关闭数据库连接时候, 只做 conn.Close(); 并没有做 conn.Dispose(),要紧吗?

解决方案 »

  1.   

    不需要做dispose。在dispose中,除了执行close之外,还要查找SQLConnection所在的容易并移除其连接,并且要向其他引用此对象的对象发送事件。而一个 close就是关闭数据库连接,没有那么多额外的动作。为了释放数据库连接池的资源,仅需要执行close,执行dispose是多余的。
      

  2.   

    还要查找SQLConnection所在的容易并移除其连接---------->还要查找SQLConnection所在的容器对象并移除其连接
      

  3.   

    那如何释放实例化的SQLConnection 对象呢? 系统自动释放吗
      

  4.   

    一楼说得不准确,补充一下re:为了释放数据库连接池的资源,仅需要执行close,执行dispose是多余的。
    执行Close()不释放数据库连接池的资源,而是把连接放回连接池中待用;Dispose则会把这个连接彻底销毁掉,不会再放入连接池。如果所有的连接都被Dispose的话,每次使用数据库都必须重新创建连接,这样很耗费资源。因此不要用Dispose,.NET会维护连接池,连接Open的时候从连接池中取出一个没有使用的连接,用完以后Close()的时候再放回连接池,实际上没有创建新的连接,从而提高了性能。
    因此为了性能,为了使用连接池,不可以dispose,但必须close().NET中所有创建的对象有垃圾收集器进行管理,不需要释放或dispose
      

  5.   

    我在回答这个问题的时候是查看了Sqlconnect的源代码的。dispose仅仅判断connectin的state状态,一条判断代码。如果是open则调用close,一条执行代码。额外动作并没有。
      

  6.   

    protected override void Dispose(bool disposing)
    {
          if (disposing)
          {
                switch (this._objectState)
                {
                      case ConnectionState.Open:
                      {
                            this.Close();
                            break;
                      }
                }
                this._constr = null;
          }
          base.Dispose(disposing);
    }我也查看了 close,以及base.Dispose。没有对连接池的额外操作。
      

  7.   

    可能是我用词不当,造成了误会。我对 fancyf(Fancyray)的细心表示感谢。我心目中的connection所用的连接池的资源,就是指这个 connection独占了连接池的一个对象(这个对象有一个Target属性指向connection对象),“释放”就是通常写对象时“不再引用”一个父对象了,并不代表销毁它。但是另一方面,dispose也并不销毁它。所有与连接池打交道的地方都在 close里边。调用 close和调用dispose的差别不在于对连接池的操作有差别。
      

  8.   

    Sorry! 是我搞错了
    It is recommended that you always close the Connection when you are finished using it in order for the connection to be returned to the pool. This can be done using either the Close or Dispose methods of the Connection object. Connections that are not explicitly closed might not be added or returned to the pool.
      

  9.   

    那如何释放 new SQLConnection() 的实例 ??
      

  10.   

    base.Dispose(disposing);
     ================这这一句执行的是什么呢?================================
    re:为了释放数据库连接池的资源,仅需要执行close,执行dispose是多余的。
    执行Close()不释放数据库连接池的资源,而是把连接放回连接池中待用;Dispose则会把这个连接彻底销毁掉,不会再放入连接池。如果所有的连接都被Dispose的话,每次使用数据库都必须重新创建连接,这样很耗费资源。因此不要用Dispose,.NET会维护连接池,连接Open的时候从连接池中取出一个没有使用的连接,用完以后Close()的时候再放回连接池,实际上没有创建新的连接,从而提高了性能。
    因此为了性能,为了使用连接池,不可以dispose,但必须close().NET中所有创建的对象有垃圾收集器进行管理,不需要释放或dispose=====================我赞同这种说法。
      

  11.   

    那如何释放实例化的SQLConnection 对象呢? 系统自动释放吗
      

  12.   

    搭车问一下,比如一个sqlcommand或者其他对象用完了,是否需要sqlcommand.dispose进行释放
      

  13.   

    .NET中所有的托管对象都不需要手动释放,全是由垃圾收集器管理