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)接和斷開數(shù)據(jù)庫(kù),,豈不是會(huì)很慢,?而且每個(gè)到SQL Server數(shù)據(jù)庫(kù)的聯(lián)接會(huì)帶來(lái)37k的系統(tǒng)開銷,,怎么辦? 可能有人會(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è)得很大,,那用戶離開之后,連接還會(huì)保留一段 時(shí)間,,也會(huì)帶來(lá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)開銷(可以加到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ì)減低速度和增加開銷的 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)開銷很大,,而且需要維持和數(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)開銷要大一些 |
|