UML软件工程组织

如何优化提高.NET的性能
作者: Builder, Tony Patton 来源:网络
  .NET的垃圾收集特性意味着不用再担心对象清理,因为.NET在后台自动处理这些工作。但由于开发者未能自行清理,我仍然遇到数据库连接变坏的问题。本文将详细探讨这一问题,并就如何在项目中避免这样的问题提出建议。

问题描述

没有正确关闭并配置由ADO.NET建立的数据库连接的问题在于:由于连接保持开放且耗用本可在其它地方被更好利用的资源,这加重了后端数据库服务器的负担。ADO.NET数据访问根据保守使用连接的结构而设计。应用程序与数据库连接的时间仅足以提取或更新数据。由于数据库不会保持在很大程度上无用的连接,所以它可为更多用户提供服务。

监控这些连接

我一直在使用一个客户端,它拥有几个由另一家咨询公司设计的.NET应用程序。除数据库连接管理以外,这些应用程序执行良好。

客户端网站的数据库管理员向我反复强调他们数据库中开放连接的数目。(任何时候)很容易查看一个SQL服务器上所开放的连接。下面的T-SQL返回一个SQL服务器实例的开放连接列表。注意,其中还包括分配给连接的用户名。

use master

select * from sysprocesses

你可以在主机名、程序名(program_name)与注册名栏中查看服务器名(访问数据库服务器)、程序名和注册名。下列的查询返回这些值:

use master

select hostname, program_name from sysprocesses

在这些栏目中,我使用下面的T-SQL来查看仅由某个特定服务器和注册名(由应用程序所使用的注册名)打开的连接:

use master

select * from sysprocesses(nolock)

where hostname = 'server_name'

and loginame = 'login_name'

上面的T-SQL帮助我迅速查看由某个应用程序打开的连接。由于每个客户端应用程序利用唯一一个登录,所以很容易为一个应用程序分配开放连接。

 解决方案

解决问题的方法很简单,就是在事后自行清理。ADO.NET连接类中包含一个关闭方法,可以正确关闭你打开的任何连接。把打开与关闭类看作挡书板是个好主意。以下是一个简明纲要,列出了一些你应关注的清理数据库连接的方法:

  • 打开:打开数据库连接。
  • 关闭:关闭数据库连接。
  • 分配:释放与数据库连接有关的所有资源。它强行对对象执行垃圾收集操作。因此,它可以保证连接关闭后,不会再占用资源。而且,连接对象的分配方法自动调用它的关闭方法。但是,我总是在分配前调用关闭方法。如果调用一个对象的分配方法超过一次,就会产生异常。
  • 状态:返回连接对象的状态。适用于在关闭前查看连接是否开放。

这些方法应用起来十分方便。例如,查看列表A中的VB.NET代码。列表B中是对应的C#代码。你可能认为这些代码功能过于强大,但应用它时,所有与数据库有关的对象都被关闭、分配并释放,没有工作留给自动垃圾收集来完成。

应用由每个需要数据库操作的方法、类或子方法/类打开或关闭的单独连接对象,是解决开放连接问题的一个常用方法。这些对象一般位于一个对连接进行集中管理的singleton数据库访问类中。

不要忽略文件

现在,未能正确关闭连接不仅会限制数据库访问,处理文件或任何流对象也会遇到问题。向一个文本文件中写入数据就是一个典型的例子。列表C中的C#代码片断建立一个文本文件,并增加任意一段文本。

关键在于:添加完数据后,要记得关闭文件。尽管似乎不用说明这个问题,但它确实会蔓延到生产应用程序中。列表D中为对应的VB.NET代码。

检查所执行的操作

内存泄露及由以前微软技术引起的相关问题已成为遥远的回忆,但.NET平台并非全无问题。开发者在应用数据库后,未能对其进行清理,就会消耗系统及数据库资源。使用对象后,开发者可将对象释放回系统中,从而避免这些问题。ADO.NET对象包含简化这一任务的关闭与分配方法。不要忘了!


版权所有:UML软件工程组织