全面優化ADO

全面優化ADO   

 選自Delphi 園地 http://www2.delphifans.com/blog/more.asp?name=hawkliu&id=438

 

1 Connection

1.1 Pooling

Web Application中,常常會出現同時有很多用戶同時訪問數據庫的情況,而且ASP中的對象作用域是頁面級的,也就是

說,每個頁面都要聯接和斷開數據庫,豈不是會很慢?而且每個到SQL Server數據庫的聯接會帶來37k的系統開銷,怎麼

辦?

可能有人會想到用ApplicationSession來解決問題,但是,這是不可取的,如果用Application,那麼會出現多個用戶同

時通過一個Connection訪問數據庫的情況,雖然節省了建立連接的時間,但是訪問數據庫的速度就會變得非常慢。如果用

Session,出現的問題就是,Session超時怎麼辦?如果把Session.Timeout設得很大,那用戶離開之後,連接還會保留一段

時間,也會帶來額外的開銷。

其實根本不用考慮這個問題,通過OLE DB訪問數據庫,它會替你解決這個問題,OLE DB有一個Resource Pooling,它會代

理你的連接請求,然後把別人剛用過的連接給你接着用。(具體機制不再闡述,其實我也沒搞太明白,嘻嘻)

1.2 Provider

可能沒有多少人用過這個Property吧,它的缺省值是MSDASQL,還有MSIDXSADSDSOObject,但是在ADO2.0(見VS98)和

ADO2.1(見SQL7)裏面提供了一些新的Provider

MSDAORA OLE DB Provider for Oracle

Microsoft.Jet.OLEDB.3.51OLE DB Provider for Microsoft Jet for ACCESS))

SQLOLEDBMicrosoft SQL Server OLE DB Provider

如果你所用的數據庫是這些的話,用這些新的Provider就可以不通過ODBC而直接訪問數據庫,提高的效率就可想而知了。

2 Command

2.1 CommandType

缺省值是adCmdUnknownADO會逐個判斷你的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語句沒有返回記錄集,如insertupdate等,那麼使用adExecuteNoRecords

ADO2.0)可以減低系統開銷(可以加到adCmdText adCmdStoredProc上,如adCmdStoredProc + adExecuteNoRecords

還有adCmdTableDirectadCmdFileADO2.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的時候使我無法使用

RecordCountProperty

使用用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的一列數據直接變成一個數組來操作速度快一些,但是系統開銷要大一些  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章