当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 数据访问-与数据库建立连接

MSSQL
SQL Server--全文本检索的应用(一)
SQL 2005的SSIS与Oracle的迁移性能
SQL优化实例:从运行30分钟到运行只要30秒
无法在SQL Server2005 Manger Studio 中录入中文的问题
SQL Artisan多表查询和统计
SQL Server数据库开发人员在应聘时经常被问到哪些问题
一个完整的SQL SERVER数据库全文索引的示例
SQL Server安全之加密术和SQL注入攻击
如何对SQL Server中的tempdb“减肥”
SQL Server 2005升级的十个步骤
如何在SQL Server开发中融入极限编程技术
SQL Server应用程序高级SQL注入(下)
SQL Server应用程序高级SQL注入(上)
SQL Server连接中的常见错误
IIS中SQL Server数据库的安全问题
SQL Server 2005区域配置和安全工具
保护 SQL Server 的十个步骤
如何利用SQL Server 2000的复制选项
SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
SQL SERVER 2005同步复制技术的应用

MSSQL 中的 数据访问-与数据库建立连接


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 42 ::
收藏到网摘: n/a

  在第一部分,我们讨论了如何优化 ASP 代码。在这一部分,我们把重点放在数据访问上。

一般情况下,数据访问时间要比 ASP 代码解释,编译时间长,不要让数据检索成为影响 ASP 性能的瓶颈。

首先,讲一些老生常谈的话。比如:需要声明变量,要用 Response.Write SQL_string 来进行调试,要用 On Error Resume
Next 来捕获错误。不要在 Application 和 Session 中存储 Connection 对象等等,都是一些很多人知道而又不屑一顾的常
识。

提高数据访问速度包含两方面内容:1 与数据库建立连接。2 检索数据。

建立高效的连接是优化数据库访问的第一步。你需要了解连接池的概念( 参见文章: 连接池(Connection Pooling)介绍 );了解
连接数据库的方法。另外,测试是很重要的,如果你想亲自进行测试,可以下载上一部分提到的 WAST ,它可以模拟大量用户同时
点击的情况。在这里,假设你使用的数据库是 MS SQL Server 7.0 ,如果 操作系统是 NT ,那么你可以在性能监视器中监测
SQL7 的用户连接数(counter:User Connections);如果操作系统是98的话,可以使用 SQL7 的 Profiler。

下面,开始讨论如何与数据库建立连接,以及连接池的问题。

1. 使用 OLEDB

与数据库建立连接有三种方法:DSN,DSN-less,OLEDB( 参见文章: 用ADO连接数据库的三种方法 )。建议使用 OLEDB。

2. 尽快释放数据库对象

假设有 page1.asp 和 page2.asp,在多人同时点击的情况下,服务器可能会这样工作:

第一个人:page1.asp 的1-5行,
第二个人:page1.asp 的1-5行,
第一个人:page1.asp 的6-20行,
第二个人:page1.asp 的1-5行,
第三个人:page1.asp 的1-5行,
第四个人:page1.asp 的1-5行,
第二个人:page1.asp 的6-20行,
第一个人:page2.asp 的1-5行,
......

设想一下:有几千人同时访问你的主页,那么,服务器就会执行数千行,数万行语句后才回到第一个人请求的页面上。因此,我们
应尽可能快的处理某个功能,某个任务。看下列代码:

<%
rs1.Open strSQL1,cnn1         'cnn1 is connection object
rs2.Open strSQL2,cnn2
rs3.Open strSQL3,cnn3
......
'处理 rs1
'处理 rs2
'处理 rs3
......
rs1.Close
rs2.Close
rs3.Close
cnn1.Close
cnn2.Close
cnn3.Close
%>

这种处理结果集的方法会占用比你想象要多的资源,正确的用法应为:

<%
rs1.Open strSQL1,cnn         'cnn is connection object
'处理 rs1
rs1.Close
cnn1.Close
......
rs2.Open strSQL2,cnn
'处理 rs2
rs2.Close
cnn2.Close
......
rs3.Open strSQL3,cnn
'处理 rs3
rs3.Close
cnn3.Close

......
%>

或许你会说:在 rs2 的处理中,我还需要 rs1 的值,所以不能在处理 rs2 前关闭 rs1。那么解决这个问题更好的办法是采用
GetRows 和 GetString,在后面会有详细的说明。

尽快的释放对象是保证数据库连接重用的前提。( 参见文章: 让数据库的连接更有效 )

3. 创建 Connection 对象,充分利用连接池。

看下列代码:

'创建 Connection Object,打开 RecordSet
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnection
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open strSQL,cnn

'直接打开 RecordSet
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.open strSQL,strConnection

在 asptoday 的 Enhancing Performance in ASP - Part 2 中对这两种方法进行了测试,结果表明直接打开 RecordSet 比创
建 Connection 快23%(快在页面处理上,检索数据库的速度是一样的。)所以,这篇文章的结论是:When working with a
single Recordset,pass the connection string into the ActiveConenction property.

我对此有异议:快的代码不一定是好的代码。

首先要说明的是,直接打开 RecordSet 的方法依然要创建与数据库的连接,只不过是由 ADO 自动完成的。其次,这个
Connection 只有在该页面处理完后才能被释放(不管是 Recordset.Close 还是 Set recordset = Nothing 都不能做到释放该
对象)。

Dim rs
Dim strcnn
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM Authors",strcnn
    rs.Close
    Set rs = Nothing
Next&nb