
1 Connection
1.1 Pooling
在Web Application中,常常會(huì)出現(xiàn)同時(shí)有很多用戶同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的情況,而且ASP中的對(duì)象作用域是頁(yè)面級(jí)的,也就是
說(shuō),每個(gè)頁(yè)面都要聯(lián)接和斷開(kāi)數(shù)據(jù)庫(kù),豈不是會(huì)很慢?而且每個(gè)到SQL Server數(shù)據(jù)庫(kù)的聯(lián)接會(huì)帶來(lái)37k的系統(tǒng)開(kāi)銷,怎么
辦?
可能有人會(huì)想到用Application和Session來(lái)解決問(wèn)題,但是,這是不可取的,如果用Application,那么會(huì)出現(xiàn)多個(gè)用戶同
時(shí)通過(guò)一個(gè)Connection訪問(wèn)數(shù)據(jù)庫(kù)的情況,雖然節(jié)省了建立連接的時(shí)間,但是訪問(wèn)數(shù)據(jù)庫(kù)的速度就會(huì)變得非常慢。如果用
Session,出現(xiàn)的問(wèn)題就是,Session超時(shí)怎么辦?如果把Session.Timeout設(shè)得很大,那用戶離開(kāi)之后,連接還會(huì)保留一段
時(shí)間,也會(huì)帶來(lái)額外的開(kāi)銷。
其實(shí)根本不用考慮這個(gè)問(wèn)題,通過(guò)OLE DB訪問(wèn)數(shù)據(jù)庫(kù),它會(huì)替你解決這個(gè)問(wèn)題,OLE DB有一個(gè)Resource Pooling,它會(huì)代
理你的連接請(qǐng)求,然后把別人剛用過(guò)的連接給你接著用。(具體機(jī)制不再闡述,其實(shí)我也沒(méi)搞太明白,嘻嘻)
1.2 Provider
可能沒(méi)有多少人用過(guò)這個(gè)Property吧,它的缺省值是MSDASQL,還有MSIDXS和ADSDSOObject,但是在ADO2.0(見(jiàn)VS98)和
ADO2.1(見(jiàn)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)
如果你所用的數(shù)據(jù)庫(kù)是這些的話,用這些新的Provider就可以不通過(guò)ODBC而直接訪問(wèn)數(shù)據(jù)庫(kù),提高的效率就可想而知了。
2 Command
2.1 CommandType
缺省值是adCmdUnknown,ADO會(huì)逐個(gè)判斷你的CommandType,直到它認(rèn)為合適為止,不建議采用。(在Recordset.Open和
Connection.Execute的時(shí)候也可以用)
adCmdText是照原樣執(zhí)行你的SQL語(yǔ)句,但是如果你的SQL Language是以下幾種的話,通過(guò)使用別的CommandType就可以提高
你的SQL語(yǔ)句執(zhí)行效率
objCmd.Execute "Select * from table_name", adCmdText可替換為objCmd.Execute "table_name",adCmdTable
objCmd.Execute "Exec proceuure_name",adCmdText可替換為objCmd.Execute "proceuure _name", adCmdStoredProc
還有很重要的一點(diǎn)就是,如果你的SQL語(yǔ)句沒(méi)有返回記錄集,如insert和update等,那么使用adExecuteNoRecords
(ADO2.0)可以減低系統(tǒng)開(kāi)銷(可以加到adCmdText 和adCmdStoredProc上,如adCmdStoredProc + adExecuteNoRecords)
還有adCmdTableDirect和adCmdFile(ADO2.0),我還不太清楚怎么用,adCmdFile可用于訪問(wèn)一個(gè)XML文件。
2.2 Prepared
如果你需要重復(fù)的執(zhí)行類似的SQL語(yǔ)句,那么你可以預(yù)編譯你的SQL語(yǔ)句,提高的效率也很可觀
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,如果你不用修改數(shù)據(jù),就不要改成adLockOptimistic之類的,否則也會(huì)減低速度和增加開(kāi)銷的
adLockReadOnly > adLockPessimistic > adLockOptimistic > adLockBatchOptimistic
3.2 CursorType
缺省是adOpenForwardOnly,如果你只用MoveNext Method,也最好不要改,速度影響140%左右
adOpenForwardOnly > adOpenDynamic > adOpenKeyset > adOpenStatic
3.3 CursorLocation
缺省是adUseServer,其實(shí)不好,它可以隨時(shí)反映數(shù)據(jù)庫(kù)服務(wù)器上的改動(dòng),但是系統(tǒng)開(kāi)銷很大,而且需要維持和數(shù)據(jù)庫(kù)服務(wù)
器的連接,但是在數(shù)據(jù)庫(kù)服務(wù)器和Web Server在一起的時(shí)候要快些。不過(guò)在adLockOptimistic的時(shí)候使我無(wú)法使用
RecordCount等Property。
使用用adUseClient的話,你可以對(duì)數(shù)據(jù)做再排序,篩選,shape等操作
如果對(duì)數(shù)據(jù)的實(shí)時(shí)性沒(méi)有要求的話,盡量用adUseClient
4 其它
4.1 Early bind
用ASP這一點(diǎn)就不用看了,如果用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來(lái)建立一個(gè)Recordset
4.4 把Recordset的一列數(shù)據(jù)直接變成一個(gè)數(shù)組來(lái)操作速度快一些,但是系統(tǒng)開(kāi)銷要大一些
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com