当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:22:00  来源:本站整理

数据拜候-与数据库成立衔接[MSSQL防范]

赞助商链接



  本文“数据拜候-与数据库成立衔接[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在第一部份,我们谈论了若何优化 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 = Nothi
  以上是“数据拜候-与数据库成立衔接[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 数据拜候-与数据库成立衔接
  • 数据拜候技术的演变
  • SQL Server 2005 Mobile Edition 3.0 中的复制和远程数据拜候功
  • <b>第十五章 数据拜候部件的利用及编程(三)</b>
  • <b>第十五章 数据拜候部件的利用及编程(二)</b>
  • 第十五章 数据拜候部件的利用及编程(一)
  • 基于Oracle OCI的数据拜候C语言接口ORADBI-开辟技术
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .