全面優化ADO
2024-07-21 02:08:35
供稿:網友
網站運營seo文章大全提供全面的站長運營經驗及seo技術!1 connection
1.1 pooling
在web application中,常常會出現同時有很多用戶同時訪問數據庫的情況,而且asp中的對象作用域是頁面級的,也就是
說,每個頁面都要聯接和斷開數據庫,豈不是會很慢?而且每個到sql server數據庫的聯接會帶來37k的系統開銷,怎么
辦?
可能有人會想到用application和session來解決問題,但是,這是不可取的,如果用application,那么會出現多個用戶同時通過一個connection訪問數據庫的情況,雖然節省了建立連接的時間,但是訪問數據庫的速度就會變得非常慢。如果用session,出現的問題就是,session超時怎么辦?如果把session.timeout設得很大,那用戶離開之后,連接還會保留一段時間,也會帶來額外的開銷。
其實根本不用考慮這個問題,通過ole db訪問數據庫,它會替你解決這個問題,ole db有一個resource pooling,它會代
理你的連接請求,然后把別人剛用過的連接給你接著用。(具體機制不再闡述,其實我也沒搞太明白,嘻嘻)
1.2 provider
可能沒有多少人用過這個property吧,它的缺省值是msdasql,還有msidxs和adsdsoobject,但是在ado2.0(見vs98)和
ado2.1(見sql7)里面提供了一些新的provider:
msdaora (ole db provider for oracle)
microsoft.jet.oledb.3.51(ole db provider for microsoft jet( for access))
sqloledb(microsoft sql server ole db provider)
如果你所用的數據庫是這些的話,用這些新的provider就可以不通過odbc而直接訪問數據庫,提高的效率就可想而知了。
2 command
2.1 commandtype
缺省值是adcmdunknown,ado會逐個判斷你的commandtype,直到它認為合適為止,不建議采用。(在recordset.open和
connection.execute的時候也可以用)
adcmdtext是照原樣執行你的sql語句,但是如果你的sql language是以下幾種的話,通過使用別的commandtype就可以提高
你的sql語句執行效率
objcmd.execute "select * from table_name", adcmdtext可替換為objcmd.execute "table_name",adcmdtable
objcmd.execute "exec proceuure_name",adcmdtext可替換為objcmd.execute "proceuure _name", adcmdstoredproc
還有很重要的一點就是,如果你的sql語句沒有返回記錄集,如insert和update等,那么使用adexecutenorecords
(ado2.0)可以減低系統開銷(可以加到adcmdtext 和adcmdstoredproc上,如adcmdstoredproc + adexecutenorecords)
還有adcmdtabledirect和adcmdfile(ado2.0),我還不太清楚怎么用,adcmdfile可用于訪問一個xml文件。
2.2 prepared
如果你需要重復的執行類似的sql語句,那么你可以預編譯你的sql語句,提高的效率也很可觀
objcmd.commandtext = "select spell from typer.wordspell where word = ? "
objcmd.prepared = true
objcmd.parameters.append objcmd.createparameter("word", advarchar, , 2)
for i = 1 to len(strname)
strchar = mid(strname, i, 1)
objcmd("word") = strchar
set objrs = objcmd.execute
if objrs.eof then
strnamesame = strnamesame & strchar
else
strnamesame = strnamesame & objrs("spell")
end if
next ''i = 1 to len(strname)
3 recordset
3.1 locktype
缺省是adlockreadonly,如果你不用修改數據,就不要改成adlockoptimistic之類的,否則也會減低速度和增加開銷的
adlockreadonly > adlockpessimistic > adlockoptimistic > adlockbatchoptimistic
3.2 cursortype
缺省是adopenforwardonly,如果你只用movenext method,也最好不要改,速度影響140%左右
adopenforwardonly > adopendynamic > adopenkeyset > adopenstatic
3.3 cursorlocation
缺省是aduseserver,其實不好,它可以隨時反映數據庫服務器上的改動,但是系統開銷很大,而且需要維持和數據庫服務
器的連接,但是在數據庫服務器和web server在一起的時候要快些。不過在adlockoptimistic的時候使我無法使用
recordcount等property。
使用用aduseclient的話,你可以對數據做再排序,篩選,shape等操作
如果對數據的實時性沒有要求的話,盡量用aduseclient
4 其它
4.1 early bind
用asp這一點就不用看了,如果用vb的話
dim objconn as adodb.connection 比 set objconn = createobject("adodb.connection")要好
4.2 ado 2.1里的shape真是好玩
4.3 ado 2.1可以用objrs.fields.append來建立一個recordset
4.4 把recordset的一列數據直接變成一個數組來操作速度快一些,但是系統開銷要大一些