国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

OLE DB Method for SQL

2024-07-21 02:10:55
字體:
供稿:網(wǎng)友
在第一部分,我們討論了如何優(yōu)化 asp 代碼。在這一部分,我們把重點放在數(shù)據(jù)訪問上。

一般情況下,數(shù)據(jù)訪問時間要比 asp 代碼解釋,編譯時間長,不要讓數(shù)據(jù)檢索成為影響 asp 性能的瓶頸。

首先,講一些老生常談的話。比如:需要聲明變量,要用 response.write sql_string 來進(jìn)行調(diào)試,要用 on error resume
next 來捕獲錯誤。不要在 application 和 session 中存儲 connection 對象等等,都是一些很多人知道而又不屑一顧的常
識。

提高數(shù)據(jù)訪問速度包含兩方面內(nèi)容:1 與數(shù)據(jù)庫建立連接。2 檢索數(shù)據(jù)。

建立高效的連接是優(yōu)化數(shù)據(jù)庫訪問的第一步。你需要了解連接池的概念( 參見文章: 連接池(connection pooling)介紹 );了解
連接數(shù)據(jù)庫的方法。另外,測試是很重要的,如果你想親自進(jìn)行測試,可以下載上一部分提到的 wast ,它可以模擬大量用戶同時
點擊的情況。在這里,假設(shè)你使用的數(shù)據(jù)庫是 ms sql server 7.0 ,如果 操作系統(tǒng)是 nt ,那么你可以在性能監(jiān)視器中監(jiān)測
sql7 的用戶連接數(shù)(counter:user connections);如果操作系統(tǒng)是98的話,可以使用 sql7 的 profiler。

下面,開始討論如何與數(shù)據(jù)庫建立連接,以及連接池的問題。

1. 使用 oledb

與數(shù)據(jù)庫建立連接有三種方法:dsn,dsn-less,oledb( 參見文章: 用ado連接數(shù)據(jù)庫的三種方法 )。建議使用 oledb。

2. 盡快釋放數(shù)據(jù)庫對象

假設(shè)有 page1.asp 和 page2.asp,在多人同時點擊的情況下,服務(wù)器可能會這樣工作:

第一個人: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行,
......

設(shè)想一下:有幾千人同時訪問你的主頁,那么,服務(wù)器就會執(zhí)行數(shù)千行,數(shù)萬行語句后才回到第一個人請求的頁面上。因此,我們
應(yīng)盡可能快的處理某個功能,某個任務(wù)。看下列代碼:

<%
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
%>

這種處理結(jié)果集的方法會占用比你想象要多的資源,正確的用法應(yīng)為:

<%
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 前關(guān)閉 rs1。那么解決這個問題更好的辦法是采用
getrows 和 getstring,在后面會有詳細(xì)的說明。

盡快的釋放對象是保證數(shù)據(jù)庫連接重用的前提。( 參見文章: 讓數(shù)據(jù)庫的連接更有效 )

3. 創(chuàng)建 connection 對象,充分利用連接池。

看下列代碼:

'創(chuàng)建 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 中對這兩種方法進(jìn)行了測試,結(jié)果表明直接打開 recordset 比創(chuàng)
建 connection 快23%(快在頁面處理上,檢索數(shù)據(jù)庫的速度是一樣的。)所以,這篇文章的結(jié)論是:when working with a
single recordset,pass the connection string into the activeconenction property.

我對此有異議:快的代碼不一定是好的代碼。

首先要說明的是,直接打開 recordset 的方法依然要創(chuàng)建與數(shù)據(jù)庫的連接,只不過是由 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    


運行上面的代碼,在性能監(jiān)視器中你會發(fā)現(xiàn)數(shù)據(jù)庫的連接被創(chuàng)建了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

采用上面的代碼,連接數(shù)只需要2個!(只為說明問題,不考慮速度)

還有一點要說明的是:服務(wù)器處理 asp 時不是一次只處理一個,也不是一次就把整個頁面處理完,沒有關(guān)閉的連接只會占用更多
的資源。所以,盡快的釋放 connection ,使它回到連接池中才是良好的編程習(xí)慣。連接池是服務(wù)器共享的資源,它不屬于某個
asp,也不屬于某個 session,或者某個 application。

wast 是我常用的測試工具,但是測試是一種手段,代替不了實際。如果你對 wast 的工作方式感興趣,可以到它的主頁去看看。
http://webtool.rte.microsoft.com/

4. 為多個 recordset創(chuàng)建一個 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 創(chuàng)建一個連接,只要傳遞一個引用就夠了。

5. 與多個數(shù)據(jù)庫連接的問題。

在大部份應(yīng)用中,我們只對一個數(shù)據(jù)庫進(jìn)行操作,但有時也會碰到與多個數(shù)據(jù)庫連接的情況。下面我們討論兩種連接方式:

'第一種:兩個 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
......


第二種方法極不可取,不僅速度低,而且浪費資源。其效率低下的根本原因在于這種連接方式?jīng)]有利用連接池,使得每一次請求都
要重新創(chuàng)建與數(shù)據(jù)庫的連接。

click!測試第一種代碼    click!測試第二種代碼    ( coolbel 不穩(wěn)定,需要多測試幾遍。)

6. 對于 disconnected recordset,不要忘記使 activeconnection = nothing
中國最大的web開發(fā)資源網(wǎng)站及技術(shù)社區(qū),
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 常熟市| 绥德县| 洞头县| 五常市| 绿春县| 翁源县| 荥阳市| 建宁县| 文化| 西华县| 青龙| 淮阳县| 林周县| 塘沽区| 额敏县| 巴青县| 安阳市| 闵行区| 宽城| 高唐县| 闽侯县| 黄大仙区| 延吉市| 称多县| 鲁山县| 揭东县| 密云县| 嘉定区| 固镇县| 宁阳县| 修武县| 乌拉特前旗| 阿拉善左旗| 剑阁县| 诸城市| 融水| 忻州市| 渑池县| 清远市| 增城市| 文化|