文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发数据库技巧 → 数据访问-与数据库建立连接

数据访问-与数据库建立连接

时间:2004/11/15 23:30:00来源:本站整理作者:蓝点我要评论(0)

在第一部分,我们讨论了如何优化 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    





运行上面的代码,在性能监视器中你会发现数据库的连接被创建了20个!



Dim cnn,rs

strcnn = "Driver={SQL Server};Server=.;Database=pubs;" &_

    "UID=sa;PWD=;OLE DB Services=-1;"

For i = 1 To 20

    Set cnn = Server.CreateObject("ADODB.Connection")

    cnn.Open strcnn

    Set rs = Server.CreateObject("ADODB.Recordset")

    rs.Open "SELECT * FROM Authors",cnn

    rs.Close

    Set rs = Nothing

    cnn.Close

    Set cnn = Nothing

Next



采用上面的代码,连接数只需要2个!(只为说明问题,不考虑速度)



还有一点要说明的是:服务器处理 ASP 时不是一次只处理一个,也不是一次就把整个页面处理完,没有关闭的连接只会占用更多

的资源。所以,尽快的释放 Connection ,使它回到连接池中才是良好的编程习惯。连接池是服务器共享的资源,它不属于某个

ASP,也不属于某个 Session,或者某个 Application。



WAST 是我常用的测试工具,但是测试是一种手段,代替不了实际。如果你对 WAST 的工作方式感兴趣,可以到它的主页去看看。

http://webtool.rte.microsoft.com/



4. 为多个 RecordSet创建一个 Connection 对象



Dim cnn,rs1,rs2,r3

strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"

Set cnn = Server.CreateObject("ADODB.Connection")

cnn.Open strcnn

Set rs1 = Server.CreateObject("ADODB.Recordset")

rs1.Open "SELECT * FROM Authors1",cnn

Set rs2 = Server.CreateObject("ADODB.Recordset")

rs2.Open "SELECT * FROM Authors2",cnn

Set rs3 = Server.CreateObject("ADODB.Recordset")

rs3.Open "SELECT * FROM Authors3",cnn

.....



道理很简单,这种做法不需要为每一个 RecordSet 创建一个连接,只要传递一个引用就够了。



5. 与多个数据库连接的问题。



在大部份应用中,我们只对一个数据库进行操作,但有时也会碰到与多个数据库连接的情况。下面我们讨论两种连接方式:



'第一种:两个 Connection,两个 RecordSet。

Set cnn1 = Server.CreateObject("ADODB.Connection")

Set cnn2 = Server.CreateObject("ADODB.Connection")

cnn1.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=pubs;user

id=coolbel;password=coolbel.com;"

cnn2.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=coolbel;user

id=coolbel;password=coolbel.com;"

Set rs1 = Server.CreateObject("ADODB.RecordSet")

Set rs2 = Server.CreateObject("ADODB.RecordSet")

rs1.Open "select * from authors",cnn1

rs2.Open "select * from mytable",cnn2

......



'第二种:一个 Connection,两个 RecordSet。

Set cnn = Server.CreateObject("ADODB.Connection")

cnn.Open "provider=sqloledb;data source=210.75.56.37;user id=coolbel;password=coolbel.com;"

Set rs1 = Server.CreateObject("ADODB.RecordSet")

Set rs2 = Server.CreateObject("ADODB.RecordSet")

rs1.Open "select * from pubs..authors",cnn

rs2.Open "select * from coolbel..mytable",cnn

......





第二种方法极不可取,不仅速度低,而且浪费资源。其效率低下的根本原因在于这种连接方式没有利用连接池,使得每一次请求都

要重新创建与数据库的连接。



Click!测试第一种代码    Click!测试第二种代码    ( coolbel 不稳定,需要多测试几遍。)



6. 对于 Disconnected RecordSet,不要忘记使 ActiveConnection = Nothing




相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 mssql企业管理器不能打 Oracle PRKC-1002错误原因和解决方案SQL SERVER数据库日志清空图文教程win2003计算机改名后sql server 2005 本地复DB2错误信息码大全

人气排行 彻底解决mysql中文乱码的办法mysql数据库root密码忘记的修改方法SQL SERVER数据库日志清空图文教程.bak备份文件如何恢复Oracle PRKC-1002错误原因和解决方案Oracle错误代码大全如何将txt的文本数据导入SQL server 2005呢DB2错误信息码大全