zoukankan      html  css  js  c++  java
  • 使用Using语句块高效地使用连接

    在C#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源。它是非决定性的,因为我们不能确定这个过程在什么时候发生。忘记关闭数据库连接可能会导致.NET可执行程序的各种问题。幸运的是,我们还有解决的方法。下面的代码说明了如何使用using子句确保实现IDisposable接口的对象在退出块时立即被释放。
      string source = "server=(local)\\NetSDK;" +
                    " integrated security=SSPI;" +
                    "database=Northwind";

    using ( SqlConnection conn = new SqlConnection ( source ) )
    {
       // Open the connection
       conn.Open ( ) ;

       // Do something useful
    }
      在这个示例中,无论块是如何退出的,using子句都会确保关闭数据库连接。
      查看一下连接类的Dispose()方法的IL代码,它们都检查连接对象的当前状态,如果其状态为打开,就调用Close()方法。浏览.NET程序集的一个强大工具是Reflector(可以从/www.aisto.com/roeder/dotnet/上获得)。这个工具允许查看任何.NET方法的IL代码,还可以把IL代码反编译为源代码,让我们轻松地确定给定的方法的作用。
      在编程时,应至少使用这两个方法中的一个,或者两个方法都使用。无论在哪里获得资源,最好都使用using ()语句,因为尽管我们都会编写Close()语句,但有时会忘记,此时using子句就会发挥作用。这两种方式都没有好的异常处理方式来替代,所以在大多数情况下,最好组合使用这两种方法,如下面的示例所示。
    try
    {
       using (SqlConnection conn = new SqlConnection ( source ))
       {
          // Open the connection
          conn.Open ( ) ;

          // Do something useful

          // Close it myself
          conn.Close ( ) ;
       }
    }
    catch (Exception e)
    {
       // Do something with the exception here...
    }
      这里显式调用了Close(),但这是不必要的,因为using子句将确保在任何情况下都执行关闭操作。但是,应确保像这样的资源尽可能早地释放。因为在块的其余部分可能有更多的代码,而在这些地方没有必要锁定资源。
      另外,如果在using块中出现了异常,using子句就会确保在资源上调用IDisposable.Dispose方法,在本例中将确保总是关闭数据库连接。这样,与必须确保在异常子句中关闭连接相比,代码的可读性更高。
    最后,如果编写一个封装资源的类,无论该资源是什么,都应实现IDisposable接口,关闭资源。这样,任何使用该类的代码都可以利用using()语句,以确保资源被释放。
  • 相关阅读:
    iOS实时查看App运行日志
    Jmeter-使用Ultimate Thread Group插件来设置负载场景
    Flask使用Flask-SQLAlchemy操作MySQL数据库
    使用requests库提交multipart/form-data 格式的请求
    spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析
    一、spark错误
    sqoop 补充
    Hbase—— rowkey 过滤器(rowfilter)
    spark 调优——基础篇
    scala 的安装 与 IDEA安装使用
  • 原文地址:https://www.cnblogs.com/yangbin1005/p/989891.html
Copyright © 2011-2022 走看看