祥細內容:
簡介
技巧 1:在 Web 服務器上緩衝常用資料
技巧 2:在 Application 或 Session 對象中緩衝常用資料
技巧 3:在 Web 服務器磁碟上快取資料和 HTML
技巧 4:避免在 Application 或 Session 對象中緩衝非靈活組件
技巧 5:不要在 Application 或 Session 對象中快取資料庫串連
技巧 6:妙用 Session 對象
技巧 7:在 COM 物件中封裝代碼
技巧 8:晚點擷取資源,早點釋放資源
技巧 9:進程外的執行將犧牲可靠性
技巧 10:顯式使用選項
技巧 11:在子常式和函數中使用局部變數
技巧 12:將常用資料複製到指令碼變數
技巧 13:避免重新定義數組
技巧 14:使用響應緩衝
技巧 15:批處理內嵌指令碼和 Response.Write 語句
技巧 16:在開始長時間的任務之前先使用 Response.IsClientConnected
技巧 17:使用 <OBJECT> 標記執行個體化對象
技巧 18:使用 ADO 對象和其他組件的 TypeLib 綁定
技巧 19:利用瀏覽器的驗證能力
技巧 20:在迴圈中避免字串串聯
技巧 21:啟用瀏覽器和代理緩衝
技巧 22:儘可能使用 Server.Transfer 替代 Response.Redirect
技巧 23:在目錄 URL 尾部加斜線
技巧 24:避免使用伺服器變數
--------------------------------------------------------------------------------
簡介
效能是一個特性。您需要預先設計效能,或是在日後重新編寫應用程式。換句話說,什麼是最大限度最佳化 Active Server Pages (ASP) 應用程式效能的好策略?
本文為最佳化 ASP 應用程式和"Visual Basic(R) 指令碼編輯器 (VBScript)"提供了許多技巧。對許多陷阱和缺陷進行了討論。本文所列的建議均在 http://www.microsoft.com 及其他網站上進行了測試,而且工作正常。本文假定您對 ASP 開發有基本的理解,包括對 VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 內部對象(請求、響應和伺服器)。
ASP 的效能,通常不止取決於 ASP 代碼本身。我們並不想在一篇文章中囊括所有的至理名言,只在最後列出與效能相關的資源。這些連結包括 ASP 和非 ASP 主題,包括"ActiveX(R) 資料對象 (ADO)"、"組件物件模型 (COM)"、資料庫和"Internet 資訊服務器 (IIS)"配置。這些是我們喜歡的連結 - 務請關注它們。
技巧 1:在 Web 服務器上緩衝常用資料
典型的 ASP 頁從後端資料庫檢索資料,然後將結果轉換為超文字標記語言 (HTML) (HTML)。無論資料庫的速度如何,從記憶體檢索資料要比從後端資料庫檢索資料快得多。從本地硬碟讀取資料通常也要比從資料庫檢索資料快得多。因此,通常可以通過在 Web 服務器(在記憶體或磁碟)上快取資料來改善效能。
緩衝是典型的空間與時間的折衷。如果恰當地快取資料,您將看到效能會有驚人的提高。為使緩衝發揮效力,它必須保持經常重用的資料,而且重新計算這些資料的代價是昂貴的或比較昂貴的。如果緩衝充滿了垃圾資料,則是對儲存空間的浪費。
不經常變化的資料也是緩衝的候選資料,因為您無須擔心資料與資料庫的同步問題。組合框、參考資料表、DHTML 片段、可延伸標記語言 (XML) (XML) 字串、功能表項目和網站組態變數(包括資料來源名稱 (DSN)、網際網路通訊協定 (IP) (IP) 地址和 Web 路徑)都是緩衝的候選資料。注意,您可以快取資料的表示而不是資料本身。如果 ASP 頁不經常更改,而且緩衝的成本也非常高(例如,整個產品目錄),請考慮預先產生 HTML,而不是在每次請求時重新繪製。
資料應緩衝在何處,有哪些緩衝策略?資料經常緩衝在 Web 服務器記憶體或 Web 服務器磁碟上。下面兩個技巧討論這些選項。
技巧 2:在 Application 或 Session 對象中緩衝常用資料
ASP Application 和 Session 對象為在記憶體中快取資料提供了方便的容器。既可以將資料賦予 Application 對象,也可將資料賦予 Session 對象,這些資料在 HTTP 調用中將保留在記憶體中。Session 資料按使用者儲存,而 Application 資料在所有使用者間共用。
何時將資料載入 Application 或 Session?通常,在 Application 或 Session 啟動時載入資料。要在 Application 或 Session 啟動時載入資料,請在下面兩函數中添加相應的代碼:
Application_OnStart()
或
Session_OnStart()
。這兩個函數應該位於 Global.asa;如果沒有,可以添加這些函數。也可以在第一次需要資料時載入資料。要進行上述操作,請在 ASP 頁中添加一些代碼(或編寫可重用的指令碼函數),這些代碼檢查資料是否存在,並在資料不存在時載入資料。這是稱為遲緩計算的經典效能技術的例子 - 在您的確需要它之前,不進行計算。請看例子:
<%
Function GetEmploymentStatusList
Dim d
d = Application("EmploymentStatusList")
If d = "" Then
' FetchEmploymentStatusList 函數(不顯示)
' 從 DB 中取出資料,返回數組
d = FetchEmploymentStatusList()
Application("EmploymentStatusList") = d
End If
GetEmploymentStatusList = d
End Function
%>
可以為每一塊所需的資料編寫類似的函數。
資料應該以什麼格式儲存?任何變數類型均可儲存,因為所有指令碼變數是各不相同的。例如,可以儲存字串、整型或數組。通常,您將以這些變數類型之一儲存 ADO 記錄集的內容。若要擷取 ADO 記錄集衍生的資料,可以手工將資料複製到 VBScript 變數中,每次一個欄位。使用一個 ADO 記錄集保留函數 GetRows()、GetString() 或 Save() (ADO 2.5),會更快更簡便。完整而詳細的內容已超出了本文的範圍。下面的示範函數使用了
GetRows()
來返回記錄集資料的數組:
' 取記錄集,以數組返回
Function FetchEmploymentStatusList
Dim rs
Set rs = createObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList = rs.GetRows() ' 以數組返回資料
rs.Close
Set rs = Nothing
End Function
對上面樣本的進一步改進應當是緩衝該列表的 HTML,而不是緩衝數組。下面是一個簡單的範例:
' 取記錄集,以"HTML 選項"列表返回
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = createObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
s = "<select name=""EmploymentStatus">" & vbCrLf
Set fldName = rs.Fields("StatusName") ' ADO 欄位綁定
Do Until rs.EOF
' 下面一行違背了不要進行字串串連,
' 但這是可以的,因為我們正在建立快取
s = s & " <option>" & fldName & "</option>" & vbCrLf
rs.MoveNext
Loop
s = s & "</select>" & vbCrLf
rs.Close
Set rs = Nothing ' 參見儘早釋放
FetchEmploymentStatusList = s ' 以字串返回資料
End Function
在正常的情況下,可以在 Application 或 Session 範圍中緩衝 ADO 記錄集本身。有兩個警告:
ADO 必須為標記的自由線程
必須使用中斷連線的記錄集。
如果不能保證滿足這兩個要求,請不要緩衝 ADO 記錄集。在下面的非靈活組件和不要緩衝串連技巧中,我們將討論在 Application 或 Session 範圍中儲存 COM 物件的危險。
如果在 Application 或 Session 範圍中儲存資料,這些資料將一直保留在那兒,直到在程式中改變它、Session 到期或 Web 應用程式重新啟動時為止。資料需要更新如何處理?若要用手工強制更新應用程式資料,可以調用只允許管理員訪問的資料更新 ASP 頁。另外,還可以通過函數,周期地自動重新整理資料。下面的樣本儲存帶快取資料的時間戳記,在指定時間間隔後重新整理資料。
<%
' 未顯示錯誤處理...
Const update_INTERVAL = 300 ' 重新整理時間間隔,以秒計
' 函數返回僱傭狀態列表
Function GetEmploymentStatusList
updateEmploymentStatus
GetEmploymentStatusList = Application("EmploymentStatusList")
End Function
' 定期更新緩衝的資料
Sub updateEmploymentStatusList
Dim d, strLastupdate
strLastupdate = Application("Lastupdate")
If (strLastupdate = "") Or _
(update_INTERVAL DateDiff("s", strLastupdate, Now)) Then
' 注意:此處可能有兩個或多個調用。這是可以的,只不過
' 產生幾個不必要的取指令罷了(就此有一個工作區)
' FetchEmploymentStatusList 函數(不顯示)
' 從 DB 中取資料,返回一個數組
d = FetchEmploymentStatusList()
' 更新 Application 對象。用 Application.Lock()
' 來確保一致的資料
Application.Lock
Application("EmploymentStatusList") = d
Application("Lastupdate") = CStr(Now)
Application.Unlock
End If
End Sub
其他樣本,請參閱具有 Application 資料的最快列表框(英文)。
請注意,在 Session 或 Application 對象中緩衝大型數組並非上策。在訪問數組元素之前,指令碼語言的文法要求建立整個數組的臨時副本。例如,如果在 Application 對象中緩衝了將美國郵遞區號映射到本地氣象站的字串數組,該字串數組有 100,000 個元素,ASP 在找出一個字串之前,必須將所有 100,000 個氣象站複製到臨時數組中。在這種情況下,建立帶自訂方法的自訂群組件,來儲存氣象站 - 或使用一個字典組件,也許更好。
請不要在倒洗澡水時把孩子一同倒掉,對這種觀點的一個新的註解是:數組提供了對記憶體中相鄰關鍵-資料對的快速尋找和儲存。索引字典比索引數組要慢。您應該根據具體情況選擇能夠提供最佳效能的資料結構。
技巧 3:在 Web 服務器磁碟上快取資料和 HTML
有時,資料過多不能在記憶體中進行緩衝。"過多"是一種定性的判斷;它取決於打算消耗的記憶體量,還有快取項目的數量和這些項的檢索頻率。總之,如果有過多的資料要在記憶體中緩衝,請考慮以文本或 XML 檔案的形式,在 Web 服務器的硬碟上快取資料。可以將在磁碟上快取資料和在記憶體中快取資料組合起來,為網站建立最優的緩衝策略。
注意,在度量單個 ASP 頁的效能時,在磁碟上檢索資料不一定比從資料庫中檢索資料快。但是,緩衝減輕了資料庫和網路的負荷。在高負荷情況下,這將明顯提高總體通訊量。在查詢成本很高時緩衝查詢的結果,緩衝便非常有效,例如多表聯合或複雜的預存程序,或緩衝大型的結果集。按照慣例,測試競爭方案。
ASP 和 COM 提供了幾種構建磁碟緩衝方案的工具。ADO 記錄集的 Save() 和 Open() 函數,儲存和載入磁碟上的記錄集。您可以使用這些方法重寫上面 Application 資料緩衝技巧中的範例代碼,用 Save() 檔案替換向 Application 對象寫入資料的代碼。
還有其他一些處理檔案的組件:
Scripting.FileSystemObject 使您能夠建立、讀取和寫入檔案。
MSXML 是隨 Internet Explorer 提供的 Microsoft(R) XML 解析器,它支援儲存和載入 XML 文檔。
LookupTable 對象(在 MSN 上使用的範例)是從磁碟載入簡單列表的良好選擇。
最後,請考慮在磁碟上快取資料的表示,而不是資料本身。預製的 HTML 可以作為 .htm 或 .asp 檔案儲存體在磁碟上;超級連結可以直接指向這些檔案。可以使用商業工具,如 XBuilder 或 Microsoft(R) SQL Server 的 Internet 發行功能來自動化 HTML 產生過程。另外,可以將 HTML 片段 #include 到 .asp 檔案。還可以使用 FileSystemObject 從磁碟讀取 HTML 檔案或使用 XML 進行早期調整(英文)。
技巧 4:避免在 Application 或 Session 對象中緩衝非靈活組件
雖然在 Application 或 Session 對象中快取資料是個好主意,但是緩衝 COM 物件可能有嚴重缺陷。將常用 COM 物件嵌入 Application 或 Session 對象通常具有吸引力。遺憾的是,很多 COM 物件,包括用 Visual Basic 6.0 或更早版本編寫的 COM 物件,在 Application 或 Session 對象中儲存時將導致嚴重的瓶頸。
特別是任何非靈活組件,在 Session 或 Application 對象中緩衝時將導致效能瓶頸。靈活組件是標記為
ThreadingModel=Both
的組件(它聚集了自由線程彙集器 (FTM))或標記為
ThreadingModel=Neutral
的組件(Windows(R) 2000 和 COM+ 中新增的"中性"模型。)下列組件是非靈活的:
自由執行緒元件(除非它們聚集了 FTM)。
Apartment 執行緒元件。
單執行緒元件。
已配置組件(Microsoft Transaction Server (MTS)/COM+ 庫和伺服器包/應用程式)為非靈活組件,除非它們是"中性"線程的。Apartment 執行緒元件和其他非靈活組件最適於在頁範圍工作(也就是說,它們在單個 ASP 頁上建立和銷毀)。
在 IIS 4.0 中,標記為
ThreadingModel=Both
的組件被視為靈活的。在 IIS 5.0 中,這已經不夠了。組件不僅必須標記為 Both,而且還必須聚集 FTM。靈活性文章說明了如何使得用"Active Template Library"編寫的 C++ 組件聚集 FTM。請注意,如果組件緩衝介面指標,這些指標本身必須為靈活的、或者必須儲存在"COM 全域介面表 (GIT)"中。如果不能重新編譯 Both 執行緒元件,使它聚集 FTM,則可以將該組件標記為
ThreadingModel=Neutral
。另外,如果不希望 IIS 進行靈活性檢查(這樣,希望非靈活組件能夠儲存在 Application 或 Session 範圍中),可以在 metabase 中設定
AspTrackThreadingModel
為
True
。不主張更改
AspTrackThreadingModel
。
如果試圖在 Application 對象中儲存用
Server.createObject
建立的非靈活組件,IIS 5.0 將產生錯誤。可以通過在 Global.asa 中使用
<object runat=server scope=application ...>
解決該問題,但是不主張這樣做,因為這將導致彙集和序列化,說明如下。
如果緩衝非靈活組件,會發生什麼錯誤呢?緩衝在 Session 對象中的非靈活組件,將把會話"鎖定"到某個 ASP 工作器線程。ASP 維護著一個工作器線程池,它向請求提供服務。通常,新的請求由第一個可用的工作器線程來處理。如果 Session 被鎖定到某個線程,則該請求將不得不等待它所關聯的線程變為可用。打個比方:您進入一個超市,挑選了一些食品,然後在第 3 號收款台交款。從這以後,每當您在這個超市購買食品,都不得不始終在第 3 號收款台交款,即使是在其他收款台人少或沒人時。
將非靈活組件儲存在 Applicaton 範圍甚至會對效能產生更嚴重的影響。ASP 將不得不建立專用的線程來運行非靈活的、Applicaton 範圍內的組件。這將導致兩種後果:所有調用不得不被彙集到該線程,而且所有調用被序列化。彙集意味著:參數不得不儲存在記憶體的共用區;對該專用線程執行昂貴的環境切換;組件的方法被執行;結果彙集到共用地區;以及經過另一個昂貴的環境切換,使控制權返回原來的線程。序列化意味著所有方法必須一個挨一個地運行(同一時刻只能運行一個方法)。兩個不同的 ASP 工作器線程不可能同時執行共用組件上的方法。這將扼殺並行機制,尤其是在多處理器電腦上。更壞的是,所有非靈活的、Application 範圍內的組件都將共用一個線程("Host STA"),所以序列化的影響更加嚴重。
是否感到困惑?下面我們提出幾個通用規則。如果您正在用 Visual Basic (6.0) 或更早版本編寫對象,請不要將它們緩衝在 Application 或 Session 對象中。如果您不知道對象的執行緒模式,就不要緩衝它。不要緩衝非靈活對象,而應當在每頁上建立並釋放它們。對象將直接運行在 ASP 工作器線程上,這樣,將不會發生彙集或序列化。如果 COM 物件正運行在 IIS 框中,而且如果它們沒有花很長時間來初始化和取消,效能將是足夠的。注意,不要用該方法使用單線程對象。小心:VB 可以建立單線程的對象!如果您必須以該方式使用單線程的對象(如 Microsoft Excel 試算表),則不要期望有很高的輸送量。
當 ADO 被標記為自由線程時,則緩衝 ADO 記錄集是安全的。要將 ADO 標記為自由線程,請使用 Makfre15.bat 檔案,該檔案通常位於如下目錄中:\\Program Files\Common\System\ADO。
警告: 如果您正在用 Microsoft Access 作為資料庫,則不應當將 ADO 標記為自由線程。通常,ADO 記錄集還必須是中斷連線的,如果您不能控制網站的 ADO 配置(例如,您是獨立的軟體廠商 [ISV],將 Web 應用程式賣給客戶,然後由他們來管理他們自己的配置),那麼不緩衝記錄集可能會更好。
詞典組件也是靈活對象。LookupTable 從資料檔案載入它的資料,並且它對組合框資料和配置資訊是有用的。來自 Duwamish Books 的 PageCache 對象提供了目錄語義,和 Caprock Dictionary 的表現一樣。這些對象或它們的派生對象可以構成有效緩衝策略的基礎。注意,Scripting.Dictionary 對象不是靈活的,所以不應當儲存在 Application 或 Session 範圍。
技巧 5:不要在 Application 或 Session 對象中快取資料庫串連
緩衝 ADO 連線通常是不好的策略。如果一個 Connection Object Storage Service在 Application 中,並在所有頁上使用,那麼所有頁將競爭使用該串連。如果 Connection Object Storage Service在 ASP Session 對象中,那麼將為每個使用者建立資料庫連接。這將串連池的好處毀於一旦,並對 Web 服務器和資料庫產生不必要的壓力。
取代快取資料庫串連的方法是,在每個使用 ADO 的 ASP 頁上建立並取消 ADO 對象。這是個有效方法,因為 IIS 具有內建的資料庫連接池。更準確的說,IIS 自動啟用 OLEDB 和 ODBC 串連池。這確保了建立並取消每個頁上的串連將是有效。
由於被串連的記錄集中儲存有對資料庫連接的引用,所以,不應當在 Application 或 Session 對象中緩衝被串連的記錄集。但是,可以安全地緩衝中斷連線的記錄集,因為它不包含對其資料連線的引用。要斷開記錄集的串連,請執行如下兩個步驟:
Set rs = Server.createObject("ADODB.RecordSet")
rs.CursorLocation = adUseClient ' 第 1 步
' 植入帶資料的記錄集
rs.Open strQuery, strProv
' 現在斷開記錄集同資料提供者和資料來源的串連
rs.ActiveConnection = Nothing ' 第 2 步
有關串連池的詳細資料,請參閱 ADO 和 SQL Server(英文)引用。
技巧 6:妙用 Session 對象
在肯定了在 Applications 和 Sessions 中緩衝的優點之後,我們建議您避免使用 Session 對象。下面將會談到,當用於忙碌網站時,Sessions 有幾個缺點。所謂忙碌,通常是指網站每秒請求數百頁或同時有數千個使用者。該技巧對於必須進行水平擴充的網站,即那些利用多個伺服器來適應負載或執行容錯功能的網站來說,更加重要。對於較小的網站,如 intranet 網站,Sessions 的便利,與開銷相比也是值得的。
為了翻新,ASP 自動為每個訪問 Web 服務器的使用者建立一個 Session。每個 Session 有大約 10 KB 記憶體開銷(在儲存在 Session 中的任何資料中是最高的),並使所有的請求都慢了一點。Session 一直保持活動狀態,直到達到可配置的逾時(通常 20 分鐘)為止。
Session 最大的問題不是效能而是延展性。Session 不能跨越 Web 服務器;一旦在一個伺服器上建立了 Session,它的資料就保持在那裡。這意味著,如果您在 Web 領域中使用 Sessions,您將不得不為每個使用者的請求設計一種策略,以便始終將這些請求引向使用者的 Session 所在的伺服器。這被稱為將使用者"粘"到 Web 服務器上。術語"粘性會話"即來源於此。由於 Session 沒有保持到磁碟上,所以,當 Web 服務器崩潰時,被"粘住"的使用者將丟失他們的 Sessions 狀態。
用於實施粘性會話的策略包括硬體和軟體解決方案。如 Windows 2000 Advanced Server 中的網路Server Load Balancer解決方案和 Cisco 公司的"本地指向器"解決方案可以實施粘性會話,但以犧牲一些延展性為代價。這些解決方案並不完美。我們不主張您現在全盤推翻您的軟體解決方案(我們過去常用 ISAPI 篩選器和 URL 矯直對方案進行檢查)。
Application 對象也不能跨越伺服器;如果您需要在 Web 領域內共用並更新 Application 資料,則需要使用後端資料庫。但唯讀 Application 資料在 Web 領域中仍然有用。
如果只是為了增加正常已耗用時間(用於處理容錯移轉和伺服器維護),大多數執行重要任務的網站將需要部署至少兩台 Web 服務器。所以,在設計執行重要任務的應用程式時,您將需要實施"粘性會話",或者簡單地避開 Sessions 以及其他任何在單個 Web 服務器上儲存使用者狀態的狀態管理技術。
如果當前沒有使用 Sessions,請確保將它們關閉。可以通過"網際網路服務管理員"(請參閱 ISM 文檔)來為應用程式執行該操作。如果決定使用 Sessions,可以採取幾個方法來將對效能的影響降低到最小。
可以將不需要 Sessions 的內容(如"協助"螢幕、訪問者地區等)移動到關閉了 Sessions 的、單獨的 ASP 應用程式中。可以逐頁提示 ASP:在給定的頁中您不需要 Session 對象;使用位於 ASP 頁頂端的如下指令:
<% @EnableSessionState=False %>
使用該指令的一個很好的原因是,Session 給框架組帶來了有趣的問題。ASP 保證任何時候只執行一個來自 Session 的請求。這樣可以確保如果瀏覽器為一個使用者請求了多個頁時,在每一時刻只有一個 ASP 請求將進入 Session;這就避免了在訪問 Session 對象時出現多線程問題。遺憾的是,結果,框架組中的所有頁均被以序列化方式繪製,一個接一個地,而不是同時地。這樣,使用者可能不得不等待很長時間才能得到所有架構內容。這意味著:如果某些架構頁不信任 Session,一定要使用
@EnableSessionState=False
指令告訴 ASP。
作為使用 Session 對象的替代方式,有很多方法可以用來管理 Session 狀態。對於狀態數量較小的情況(不到 4 KB),通常建議使用 Cookies、QueryString 變數和隱藏形式的變數。對於較大數量的資料,如購物推車,則使用後端資料庫是最合適的選擇。關於在 Web 服務器領域中的狀態管理技術已經有很多資料。詳細資料,請參閱 工作階段狀態(英文)。
技巧 7:在 COM 物件中封裝代碼
如果您有很多 VBScript 或 JScript,那麼您可以通過把代碼移動到已編譯的 COM 物件來經常改進它們的效能。已編譯的代碼通常比被解釋代碼運行得更快。已編譯的 COM 物件可以通過"早期繫結"訪問其他 COM 物件,這種調用 COM 物件方法的手段,比指令碼所使用的"後期綁定"更有效。
將代碼封裝在 COM 物件種有如下好處(超越效能):
COM 物件是將表達邏輯與商務邏輯分隔開來的好辦法。
COM 物件啟用了代碼重用。
很多開發商發現,用 VB、C++ 或 Visual J++ 書寫的代碼,比 ASP 更容易調試。
COM 物件有一些缺點,包括初始開發時間以及需要不同的編程技巧。需要警告您的是,封裝"少"量的 ASP 可能會導致效能降低,而不是提高。通常,在少量 ASP 代碼封裝到 COM 物件時出現這樣的情況。這時候,建立和調用 COM 物件的開銷,超過了已編譯代碼的好處。至於 ASP 指令碼和 COM 物件代碼怎樣合并才能產生最佳效能還有待測試。注意,與 Windows NT(R) 4.0/IIS 4.0 相比,Microsoft 已經在 Windows 2000/IIS 5.0 中極大地提高了指令碼和 ADO 效能。這樣,已編譯代碼對 ASP 代碼的效能優勢已經隨著 IIS 5.0 的引入而降低。
有關在 ASP 中使用 COM 物件的優缺點的更多討論,請參閱 ASP 組件準則和用 COM 和 Microsoft Visual Basic 6.0 對分布式應用程式進行編程(英文)。如果您的確部署了 COM 組件,要對它們進行強度測試是非常重要的。實際上,所有 ASP 應用程式都應當作為正式過程進行強度測試。
技巧 8:晚點擷取資源,早點釋放資源
這是個小技巧。通常,最好晚點擷取資源而要早點釋放資源。這些資源套件括 COM 物件、檔案控制代碼和其他資源。
ADO 連線和記錄集是這種最佳化的首要目標。當您使用完記錄集,就是說用它的資料列印完一個表格後,請立即將它釋放,而不是等到頁的末尾。將您的 VBScript 變數設定為
Nothing
是最好的做法。不要讓記錄集簡單地脫離範圍。同時,應當釋放任何有關的 Command 或 Connection 對象。(不要忘了對記錄集或"串連"調用
Close()
,在將它們設定為
= Nothing
之前。)這將縮短資料庫必須為您調整資源的時間跨度,並將資料庫連接儘可能快地釋放給串連池。