zoukankan      html  css  js  c++  java
  • .net 中 sqlconnection 的 dispose()、close() 区别

    转自:https://www.cnblogs.com/lykbk/p/fghbrt54645645645.html

      IDispose 接口可以通过 Using 关键字实现使用后立刻销毁,因此,Dispose 适合只在方法中调用一次 SqlConnection 对象,而 Close 更适合 SqlConnection 在关闭后可能需要再次打开的情况。
      Close() 方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接,应用程序可以多次调用 Close。不会生成任何异常。如果将连接池值 Pooling 设置为 true 或 yes,则也会释放物理连接。

      Dispose() 方法实际是和 Close() 做的同一件事,唯一的区别是 Dispose 方法清空了 ConnectionString,即设置为了 null。

      using 表示在 {} 区间后,自动调用 Dispose 方法,保证对象被销毁。 using 只能用在集成了 IDispose 接口的类上

      引用微软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,实际上在这二者的选择上是有差异的,dispose 方法会执行 close 方法

  • 相关阅读:
    减治算法之寻找第K小元素问题
    OpenGL的版本号历史和发展
    动态注冊监听
    Thinking in Java -- 类型信息RTTI
    Unity3D
    Oracle改动字段类型
    函数定义
    foreach
    数组
    结构体
  • 原文地址:https://www.cnblogs.com/xwgli/p/13689930.html
Copyright © 2011-2022 走看看