在一般情况下,当在.NET中使用数据库连接时,要确保在使用每个资源后立即关闭。尽管.NET的设计人员实现了自动的垃圾收集,垃圾最终都会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。
当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,这样可能会影响其他会话。在极端的情况下,不关闭连接会使其他用户无法进入一整组数据表,极大地降低了应用程序的性能。为此关闭数据库连接,要将一直处于打开状态的资源删除。
在C#中,有如下两种方式可以确保数据库连接等类资源在使用后立即释放。
1.利用try…catch…finally语句块
利用try…catch…finally语句块实现连接优化的流程比较简单,例如下面的代码:
上述实例文件的设计流程如下。
1)使用using指令引用SQL Server数据库。
2)定义对象mm,设置和Northwind数据库的连接参数。
3)利用try…catch…finally语句块实现和Northwind数据库的连接。
将上述代码保存为“光盘:\daima\17\cachlianjie”,执行后将在控制台内输出数据库的数据,如图17-10所示。
(www.xing528.com)
图17-10 输出数据库数据
在上述finally块中,可以释放已经使用的任何资源。这种方式的缺点是必须确保关闭连接,初学者很容易忘记在finally块中添加关闭连接的命令,所以应在编码风格上添加不容易出现反常情况的内容。
2.使用using语句块
在C++中,只要某对象使用完毕后就会自动调用其析构函数。所以一旦出现了异常,若没有捕获,有析构函数的所有对象就会调用它们的析构函数。
在C#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源。这样并不能确定这个过程在什么时候发生,忘记关闭数据库连接可能会导致.NET可执行程序的各种问题。但是可以使用using子句来解决问题,看下面一段代码:
在上述代码中,通过using子句实现IDisposable接口对象在退出块时立即被释放。并且无论语句块是如何退出的,using子句都会关闭数据库连接。
在编程时,至少应该使用上述两种方法中的一个,或者两种方法都使用。无论在哪里获得资源,最好都使用using()语句。上述方式都没有好的异常处理方式来替代,所以在大多数情况下,最好组合使用这两种方法。例如下面的代码:
这样,如果在using块中出现了异常,using子句就会确保在资源上调用IDisposable.Dispose方法,在上述代码中将确保总是关闭数据库连接。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。