.net数据访问--高效的使用连接

     一般情况下,当在.net中使用“稀缺”的资源时,例如数据库连接。窗口或图像对象,最好确保每个资源在使用后立即关闭。尽管.net的设计人员实现了自动的垃圾收集,垃圾最终都是会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。
     当编写访问数据库的代码时,这是非常明确的,因为使连接打开的时间略长豫需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接会使其他用户无法进入一整组数据表,极大的影响降低了应用程序的性能。关闭数据库连接应是强制的。
     主要有两种方式可以确保数据库连接等类似的“稀缺”资源在使用后立即释放。
     1.第一种方式:利用try...catch...finally语句块
     确保释放资源的第一种方式是利用try...catch...finally块,确保在finally块中关闭任何已打开的连接,下面是一个小示例:

Code

     在finally块中,可以释放已经使用的任何资源,这种方式的惟一麻烦是必须确保关闭连接,很容易忘记在finally块中添加关闭连接的命令,所以应在编码风格上添加一些不容易出现反常情况的内容。
     另外,在给定的方法中可能会打开许多资源(例如两个数据库连接和一个文件),这样try...cathc...finally块的层次可能不容易看懂。
     2.第二种方式---使用using语句块
     在开发C#的过程中,.net在对象不再引用自后清理他们的方法是使用非决定性的析构方式,这已经引起了一个非常热烈的讨论。
     在C++中,对象只要使用完毕,就会自动调用其析构函数。在c#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,他会在未来的某个时刻释放资源。他是非决定性的,因为我们不能确定这个过程在什么时候发生。幸运的是,我们还有解决的方法,下面的代码说明了如何使用using子句确保实现IDisposable接口的对象在退出块时立即被释放。

Code

     在这个示例中,无论块是如何退出的,using子句都会确保关闭数据库连接。
     在查看一下连接类的Dispose()方法的IL代码,他们都检查连接对象的当前状态,如果其状态为打开,就调用Close()方法。浏览.net程序集的一个强大工具Reflector。这个工具允许查看任何.net方法的IL代码,还可以把IL代码反编译为源码。
     在编程时,应至少使用这两个方法中的一个,或者这两个方法都使用。无论在哪里获得资源,最好都使用using()语句,因为尽管我们都会编写Close()语句,但有时会忘记,此时using子句就会发挥作用。这两种方式都没有号的异常处理方式来替代,所以在大多数情况下,最好组合使用这两种方法

Code

     这里显示的调用了Close(),但这是不必要的,因为using子句将确保在任何情况下都执行关闭操作。但是,应确保像这样的资源尽可能早的释放。

 

posted @ 2009-01-24 20:55  东明  阅读(345)  评论(0)    收藏  举报