效能 在本文的第一部分中,我回顧了有關ASP開發的一些基本問題,介紹了一些效能測試的結果,以理解我們放置在頁面中的代碼可能對運行效能造成什麼樣的影響。在這個系列的第二部分,我們將探討經過論證的ASP最廣泛的用途,即通過ActiveX 資料對象(ADO)互動使用資料庫內容。ADO是Microsoft通用並簡單的資料庫介面。
ADO有很多的功能設定,因此準備這篇文章時最大的挑戰便是限制測試問題的範圍。考慮到讀取大資料集會為網頁伺服器施加很大的負載,我決定將研究的內容局限在為使用ADO記錄集尋找最佳化配置的方面。但是這個限制還是提出了一個挑戰,因為ADO為執行同一個功能提供了多種方式。比如說,記錄集可以從Recordset 類中恢複,也可以從Connection和Command 類中恢複。另外,一旦你有了一個記錄集,那麼有很多個選擇會戲劇性地影響效能。因此,同第一部分一樣,我將儘可能地多涉及一些具體問題。
目的
我研究的目的是擷取足夠的資訊以找到以下問題的答案:
* 是否應該使用ADOVBS.inc包含檔案?
* 當使用一個記錄集時,是否應該建立一個單獨的Connection對象?
* 恢複一個記錄集最好的方法是什麼?
* 指標和鎖的類型中,哪些是最有效?
* 是否應該使用斷開的記錄集?
* 設定記錄集(Recordset)屬性的最好方法是什麼?
* 引用記錄集中域值的最有效方法是什麼?
* 使用臨時字串可以較好地代替緩衝器嗎?
測試是如何設立的?
為進行這項研究中的測試,我們共組裝了21個ASP頁面(包含在本文下載內容中)。每個頁面都被配置成用3個不同的查詢返回記錄集運行,這些記錄集中分別有0、25、250條記錄。這可以協助我們將裝載記錄集的問題和在記錄集中迴圈上的效能問題隔離開。
為滿足這些變化的條件,資料庫連接字串和測試SQL字串都作為應用程式變數儲存在Global.asa中。因為我們的測試資料庫是在Microsoft SQL Server 7.0上啟動並執行,因此我們的連接字串指定OLEDB作為串連供應者、Northwind 樣本資料庫(包含在SQL伺服器中)作為當前資料庫。SQL SELECT語句要求Northwind Orders 表格中的7個特定域。
< SCRIPT LANGUAGE=VBScript RUNAT=Server >
Sub Application_OnStart
Application("Conn") = "Provider=SQLOLEDB; " & _
"Server=MyServer; " & _
"uid=sa; " & _
"pwd=;" & _
"DATABASE=northwind"
Application("SQL") = "SELECT TOP 0 OrderID, " & _
" CustomerID, " & _
" EmployeeID, " & _
" OrderDate, " & _
" RequiredDate, " & _
" ShippedDate, " & _
" Freight " & _
"FROM [Orders] "
End Sub
< /SCRIPT >
'alternate sql ?25 records
Application("SQL") = "SELECT TOP 25 OrderID, " & _
" CustomerID, " & _
" EmployeeID, " & _
" OrderDate, " & _
" RequiredDate, " & _
" ShippedDate, " & _
" Freight " & _
"FROM [Orders] "
'alternate sql ?250 records
Application("SQL") = "SELECT TOP 250 OrderID, " & _
" CustomerID, " & _
" EmployeeID, " & _
" OrderDate, " & _
" RequiredDate, " & _
" ShippedDate, " & _
" Freight " & _
"FROM [Orders] "
我們的測試伺服器是一個雙450 MHz Pentium ,512MB的RAM,在其上運行著NT Server 4.0 SP5, MDAC 2.1 (資料訪問組件)以及Microsoft Scripting Engine的5.0版本。SQL伺服器在一個同樣規格的單獨機器上運行。同第一篇文章一樣,我使用Microsoft的Web應用程式重點工具記錄從最初的頁面請求到傳輸最後一個位元組(TTLB )的時間,精確到伺服器上的毫秒級。這個測試指令碼運行20小時,調用每個頁面1300次以上。顯示的時間是session的平均TTLB。要記住的是,同第一篇文章一樣,我們只是試圖涉及效能方面的問題,而非伸縮性和容量的問題。
還請注意,我們在伺服器上開啟了緩衝器。另外,我把所有的檔案名稱都定為同樣長度,因此檔案名稱中就會有一個或多個底線來襯墊。
開始
在第一個測試中,我們使用典型Microsoft ASP ADO 樣本檔案中的典型情境來恢複一個簡單的記錄集。在這個例子( ADO__01.asp )中,我們首先建立一個Connection對象,然後建立一個Recordset對象。當然,我在指令碼中進行了一些修改,以反映在本系列的第一部分中涉及到的一些好的做法。
< % Option Explicit % >
< !-- #Include file="ADOVBS.INC" -- >
< %
Dim objConn
Dim objRS
Response.Write( _
"< HTML >< HEAD >" & _
"< TITLE >ADO Test< /TITLE >" & _
"< /HEAD >< BODY >" _
)
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open Application("Conn")
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.ActiveConnection = objConn
objRS.CursorType = adOpenForwardOnly
objRS.LockType = adLockReadOnly
objRS.Open Application("SQL")
If objRS.EOF Then
Response.Write("No Records Found")
Else
'write headings
Response.Write( _
"< TABLE BORDER=1 >" & _
"< TR >" & _
"< TH >OrderID< /TH >" & _
"< TH >CustomerID< /TH >" & _
"< TH >EmployeeID< /TH >" & _
"< TH >OrderDate< /TH >" & _
"< TH >RequiredDate< /TH >" & _
"< TH >ShippedDate< /TH >" & _
"< TH >Freight< /TH >" & _
"< /TR >" _
)
'write data
Do W