.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帮助我迅速查看由某个应用程序打开的连接。由于每个客户端应用程序利用唯一一个登录,所以很容易为一个应用程序分配开放连接。