明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

改進(jìn)性能與樣式的 25+ ASP 技巧(1)

[摘要]Len Cardinal - Microsoft Consulting Services 高級(jí)顧問George V. Reilly - Microsoft IIS Performance 主管 更新...
Len Cardinal - Microsoft Consulting Services 高級(jí)顧問
George V. Reilly - Microsoft IIS Performance 主管
更新時(shí)間:2000年4月
根據(jù) Nancy Cluts 的文章(英文)改寫
Nancy Cluts - 開發(fā)人員技術(shù)工程師
Microsoft Corporation

摘要:本文提供了優(yōu)化 ASP 應(yīng)用程序和 VBScript 的技巧。

目錄

簡(jiǎn)介

技巧 1:在 Web 服務(wù)器上緩存常用數(shù)據(jù)

技巧 2:在 Application 或 Session 對(duì)象中緩存常用數(shù)據(jù)

技巧 3:在 Web 服務(wù)器磁盤上緩存數(shù)據(jù)和 HTML

技巧 4:避免在 Application 或 Session 對(duì)象中緩存非靈活組件

技巧 5:不要在 Application 或 Session 對(duì)象中緩存數(shù)據(jù)庫(kù)連接

技巧 6:妙用 Session 對(duì)象

技巧 7:在 COM 對(duì)象中封裝代碼

技巧 8:晚點(diǎn)獲取資源,早點(diǎn)釋放資源

技巧 9:進(jìn)程外的執(zhí)行將犧牲可靠性

技巧 10:顯式使用選項(xiàng)

技巧 11:在子例程和函數(shù)中使用局部變量

技巧 12:將常用數(shù)據(jù)復(fù)制到腳本變量

技巧 13:避免重新定義數(shù)組

技巧 14:使用響應(yīng)緩沖

技巧 15:批處理內(nèi)嵌腳本和 Response.Write 語(yǔ)句

技巧 16:在開始長(zhǎng)時(shí)間的任務(wù)之前先使用 Response.IsClientConnected

技巧 17:使用 <OBJECT> 標(biāo)記實(shí)例化對(duì)象

技巧 18:使用 ADO 對(duì)象和其他組件的 TypeLib 綁定

技巧 19:利用瀏覽器的驗(yàn)證能力

技巧 20:在循環(huán)中避免字符串串聯(lián)

技巧 21:?jiǎn)⒂脼g覽器和代理緩存

技巧 22:盡可能使用 Server.Transfer 替代 Response.Redirect

技巧 23:在目錄 URL 尾部加斜線

技巧 24:避免使用服務(wù)器變量

技巧 25:升級(jí)為最新的和最好的版本

技巧 26:調(diào)整 Web 服務(wù)器

技巧 27:進(jìn)行性能測(cè)試

技巧 28:讀取資源鏈接


--------------------------------------------------------------------------------

簡(jiǎn)介

性能是一個(gè)特性。您需要預(yù)先設(shè)計(jì)性能,或是在日后重新編寫應(yīng)用程序。換句話說,什么是最大限度優(yōu)化 Active Server Pages (ASP) 應(yīng)用程序性能的好策略?

本文為優(yōu)化 ASP 應(yīng)用程序和“Visual Basic(R) 腳本編輯器 (VBScript)”提供了許多技巧。對(duì)許多陷阱和缺陷進(jìn)行了討論。本文所列的建議均在 http://www.microsoft.com 及其他站點(diǎn)上進(jìn)行了測(cè)試,而且工作正常。本文假定您對(duì) ASP 開發(fā)有基本的理解,包括對(duì) VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 內(nèi)部對(duì)象(請(qǐng)求、響應(yīng)和服務(wù)器)。

ASP 的性能,通常不止取決于 ASP 代碼本身。我們并不想在一篇文章中囊括所有的至理名言,只在最后列出與性能相關(guān)的資源。這些鏈接包括 ASP 和非 ASP 主題,包括“ActiveX(R) 數(shù)據(jù)對(duì)象 (ADO)”、“部件對(duì)象模型 (COM)”、數(shù)據(jù)庫(kù)和“Internet 信息服務(wù)器 (IIS)”配置。這些是我們喜歡的鏈接 - 務(wù)請(qǐng)關(guān)注它們。

技巧 1:在 Web 服務(wù)器上緩存常用數(shù)據(jù)

典型的 ASP 頁(yè)從后端數(shù)據(jù)庫(kù)檢索數(shù)據(jù),然后將結(jié)果轉(zhuǎn)換為超文本標(biāo)記語(yǔ)言 (HTML)。無論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存檢索數(shù)據(jù)要比從后端數(shù)據(jù)庫(kù)檢索數(shù)據(jù)快得多。從本地硬盤讀取數(shù)據(jù)通常也要比從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)快得多。因此,通常可以通過在 Web 服務(wù)器(在內(nèi)存或磁盤)上緩存數(shù)據(jù)來改善性能。

緩存是典型的空間與時(shí)間的折衷。如果恰當(dāng)?shù)鼐彺鏀?shù)據(jù),您將看到性能會(huì)有驚人的提高。為使緩存發(fā)揮效力,它必須保持經(jīng)常重用的數(shù)據(jù),而且重新計(jì)算這些數(shù)據(jù)的代價(jià)是昂貴的或比較昂貴的。如果緩存充滿了垃圾數(shù)據(jù),則是對(duì)存儲(chǔ)器的浪費(fèi)。

不經(jīng)常變化的數(shù)據(jù)也是緩存的候選數(shù)據(jù),因?yàn)槟鸁o須擔(dān)心數(shù)據(jù)與數(shù)據(jù)庫(kù)的同步問題。組合框、引用表、DHTML 碎片、可擴(kuò)展標(biāo)記語(yǔ)言 (XML) 字符串、菜單項(xiàng)和站點(diǎn)配置變量(包括數(shù)據(jù)源名稱 (DSN)、Internet 協(xié)議 (IP) 地址和 Web 路徑)都是緩存的候選數(shù)據(jù)。注意,您可以緩存數(shù)據(jù)的表示而不是數(shù)據(jù)本身。如果 ASP 頁(yè)不經(jīng)常更改,而且緩存的成本也非常高(例如,整個(gè)產(chǎn)品目錄),請(qǐng)考慮預(yù)先生成 HTML,而不是在每次請(qǐng)求時(shí)重新繪制。

數(shù)據(jù)應(yīng)緩存在何處,有哪些緩存策略?數(shù)據(jù)經(jīng)常緩存在 Web 服務(wù)器內(nèi)存或 Web 服務(wù)器磁盤上。下面兩個(gè)技巧討論這些選項(xiàng)。

技巧 2:在 Application 或 Session 對(duì)象中緩存常用數(shù)據(jù)

ASP Application 和 Session 對(duì)象為在內(nèi)存中緩存數(shù)據(jù)提供了方便的容器。既可以將數(shù)據(jù)賦予 Application 對(duì)象,也可將數(shù)據(jù)賦予 Session 對(duì)象,這些數(shù)據(jù)在 HTTP 調(diào)用中將保留在內(nèi)存中。Session 數(shù)據(jù)按用戶存儲(chǔ),而 Application 數(shù)據(jù)在所有用戶間共享。

何時(shí)將數(shù)據(jù)載入 Application 或 Session?通常,在 Application 或 Session 啟動(dòng)時(shí)加載數(shù)據(jù)。要在 Application 或 Session 啟動(dòng)時(shí)加載數(shù)據(jù),請(qǐng)?jiān)谙旅鎯珊瘮?shù)中添加相應(yīng)的代碼:Application_OnStart() 或 Session_OnStart()。這兩個(gè)函數(shù)應(yīng)該位于 Global.asa;如果沒有,可以添加這些函數(shù)。也可以在第一次需要數(shù)據(jù)時(shí)加載數(shù)據(jù)。要進(jìn)行上述操作,請(qǐng)?jiān)?ASP 頁(yè)中添加一些代碼(或編寫可重用的腳本函數(shù)),這些代碼檢查數(shù)據(jù)是否存在,并在數(shù)據(jù)不存在時(shí)加載數(shù)據(jù)。這是稱為遲緩計(jì)算的經(jīng)典性能技術(shù)的例子 - 在您的確需要它之前,不進(jìn)行計(jì)算。請(qǐng)看例子:

<%
Function GetEmploymentStatusList
   Dim d
   d = Application("EmploymentStatusList")
   If d = "" Then
      ' FetchEmploymentStatusList 函數(shù)(不顯示)
      ' 從 DB 中取出數(shù)據(jù),返回?cái)?shù)組
      d = FetchEmploymentStatusList()
      Application("EmploymentStatusList") = d
   End If
   GetEmploymentStatusList = d
End Function
%>

可以為每一塊所需的數(shù)據(jù)編寫類似的函數(shù)。

數(shù)據(jù)應(yīng)該以什么格式存儲(chǔ)?任何變量類型均可存儲(chǔ),因?yàn)樗心_本變量是各不相同的。例如,可以存儲(chǔ)字符串、整型或數(shù)組。通常,您將以這些變量類型之一存儲(chǔ) ADO 記錄集的內(nèi)容。若要獲取 ADO 記錄集衍生的數(shù)據(jù),可以手工將數(shù)據(jù)復(fù)制到 VBScript 變量中,每次一個(gè)字段。使用一個(gè) ADO 記錄集保留函數(shù) GetRows()、GetString() 或 Save() (ADO 2.5),會(huì)更快更簡(jiǎn)便。完整而詳細(xì)的內(nèi)容已超出了本文的范圍。下面的演示函數(shù)使用了 GetRows() 來返回記錄集數(shù)據(jù)的數(shù)組:

' 取記錄集,以數(shù)組返回
Function FetchEmploymentStatusList
   Dim rs
   Set rs = CreateObject("ADODB.Recordset")
   rs.Open "select StatusName, StatusID from EmployeeStatus", _
           "dsn=employees;uid=sa;pwd=;"
   FetchEmploymentStatusList = rs.GetRows() ' 以數(shù)組返回?cái)?shù)據(jù)
   rs.Close
   Set rs = Nothing
End Function

對(duì)上面示例的進(jìn)一步改進(jìn)應(yīng)當(dāng)是緩存該列表的 HTML,而不是緩存數(shù)組。下面是一個(gè)簡(jiǎn)單的范例:

' 取記錄集,以“HTML 選項(xiàng)”列表返回
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
     ' 下面一行違背了不要進(jìn)行字符串連接,
     ' 但這是可以的,因?yàn)槲覀冋诮⒏咚倬彺?br>     s = s & " <option>" & fldName & "</option>" & vbCrLf
     rs.MoveNext
   Loop
   s = s & "</select>" & vbCrLf
   rs.Close
   Set rs = Nothing ' 參見盡早釋放
   FetchEmploymentStatusList = s ' 以字符串返回?cái)?shù)據(jù)
End Function

在正常的情況下,可以在 Application 或 Session 作用域中緩存 ADO 記錄集本身。有兩個(gè)警告:

ADO 必須為標(biāo)記的自由線程
必須使用斷開連接的記錄集。
如果不能保證滿足這兩個(gè)要求,請(qǐng)不要緩存 ADO 記錄集。在下面的非靈活組件和不要緩存連接技巧中,我們將討論在 Application 或 Session 作用域中存儲(chǔ) COM 對(duì)象的危險(xiǎn)。

如果在 Application 或 Session 作用域中存儲(chǔ)數(shù)據(jù),這些數(shù)據(jù)將一直保留在那兒,直到在程序中改變它、Session 過期或 Web 應(yīng)用程序重新啟動(dòng)時(shí)為止。數(shù)據(jù)需要更新如何處理?若要用手工強(qiáng)制更新應(yīng)用程序數(shù)據(jù),可以調(diào)用只允許管理員訪問的數(shù)據(jù)更新 ASP 頁(yè)。另外,還可以通過函數(shù),周期地自動(dòng)刷新數(shù)據(jù)。下面的示例存儲(chǔ)帶緩存數(shù)據(jù)的時(shí)間戳,在指定時(shí)間間隔后刷新數(shù)據(jù)。

<%
' 未顯示錯(cuò)誤處理...
Const UPDATE_INTERVAL = 300 ' 刷新時(shí)間間隔,以秒計(jì)

' 函數(shù)返回雇傭狀態(tài)列表
Function GetEmploymentStatusList
   UpdateEmploymentStatus
   GetEmploymentStatusList = Application("EmploymentStatusList")
End Function

' 定期更新緩存的數(shù)據(jù)
Sub UpdateEmploymentStatusList
   Dim d, strLastUpdate
   strLastUpdate = Application("LastUpdate")
   If (strLastUpdate = "") Or _
         (UPDATE_INTERVAL  DateDiff("s", strLastUpdate, Now)) Then

      ' 注意:此處可能有兩個(gè)或多個(gè)調(diào)用。這是可以的,只不過
      ' 產(chǎn)生幾個(gè)不必要的取指令罷了(就此有一個(gè)工作區(qū))

      ' FetchEmploymentStatusList 函數(shù)(不顯示)
      ' 從 DB 中取數(shù)據(jù),返回一個(gè)數(shù)組
      d = FetchEmploymentStatusList()

      ' 更新 Application 對(duì)象。用 Application.Lock()
      ' 來確保一致的數(shù)據(jù)
      Application.Lock
      Application("EmploymentStatusList") = d
      Application("LastUpdate") = CStr(Now)
      Application.Unlock
   End If
End Sub

其他示例,請(qǐng)參閱具有 Application 數(shù)據(jù)的最快列表框(英文)。

請(qǐng)注意,在 Session 或 Application 對(duì)象中緩存大型數(shù)組并非上策。在訪問數(shù)組元素之前,腳本語(yǔ)言的語(yǔ)法要求建立整個(gè)數(shù)組的臨時(shí)副本。例如,如果在 Application 對(duì)象中緩存了將美國(guó)郵政編碼映射到本地氣象站的字符串?dāng)?shù)組,該字符串?dāng)?shù)組有 100,000 個(gè)元素,ASP 在找出一個(gè)字符串之前,必須將所有 100,000 個(gè)氣象站復(fù)制到臨時(shí)數(shù)組中。在這種情況下,建立帶自定義方法的自定義組件,來存儲(chǔ)氣象站 - 或使用一個(gè)字典組件,也許更好。

請(qǐng)不要在倒洗澡水時(shí)把孩子一同倒掉,對(duì)這種觀點(diǎn)的一個(gè)新的注解是:數(shù)組提供了對(duì)內(nèi)存中相鄰關(guān)鍵-數(shù)據(jù)對(duì)的快速查找和存儲(chǔ)。索引字典比索引數(shù)組要慢。您應(yīng)該根據(jù)具體情況選擇能夠提供最佳性能的數(shù)據(jù)結(jié)構(gòu)。

技巧 3:在 Web 服務(wù)器磁盤上緩存數(shù)據(jù)和 HTML

有時(shí),數(shù)據(jù)過多不能在內(nèi)存中進(jìn)行緩存!斑^多”是一種定性的判斷;它取決于打算消耗的內(nèi)存量,還有緩存項(xiàng)的數(shù)量和這些項(xiàng)的檢索頻率?傊,如果有過多的數(shù)據(jù)要在內(nèi)存中緩存,請(qǐng)考慮以文本或 XML 文件的形式,在 Web 服務(wù)器的硬盤上緩存數(shù)據(jù)?梢詫⒃诖疟P上緩存數(shù)據(jù)和在內(nèi)存中緩存數(shù)據(jù)組合起來,為站點(diǎn)建立最優(yōu)的緩存策略。

注意,在度量單個(gè) ASP 頁(yè)的性能時(shí),在磁盤上檢索數(shù)據(jù)不一定比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)快。但是,緩存減輕了數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)的負(fù)荷。在高負(fù)荷情況下,這將明顯提高總體通信量。在查詢成本很高時(shí)緩存查詢的結(jié)果,緩存便非常有效,例如多表聯(lián)合或復(fù)雜的存儲(chǔ)過程,或緩存大型的結(jié)果集。按照慣例,測(cè)試競(jìng)爭(zhēng)方案。

ASP 和 COM 提供了幾種構(gòu)建磁盤緩存方案的工具。ADO 記錄集的 Save() 和 Open() 函數(shù),保存和加載磁盤上的記錄集。您可以使用這些方法重寫上面 Application 數(shù)據(jù)緩存技巧中的范例代碼,用 Save() 文件替換向 Application 對(duì)象寫入數(shù)據(jù)的代碼。

還有其他一些處理文件的組件:

Scripting.FileSystemObject 使您能夠創(chuàng)建、讀取和寫入文件。
MSXML 是隨 Internet Explorer 提供的 Microsoft(R) XML 解析器,它支持保存和加載 XML 文檔。
LookupTable 對(duì)象(在 MSN 上使用的范例)是從磁盤加載簡(jiǎn)單列表的良好選擇。
最后,請(qǐng)考慮在磁盤上緩存數(shù)據(jù)的表示,而不是數(shù)據(jù)本身。預(yù)制的 HTML 可以作為 .htm 或 .asp 文件存儲(chǔ)在磁盤上;超級(jí)鏈接可以直接指向這些文件?梢允褂蒙虡I(yè)工具,如 XBuilder 或 Microsoft(R) SQL Server 的 Internet 發(fā)行功能來自動(dòng)化 HTML 生成過程。另外,可以將 HTML 片段 #include 到 .asp 文件。還可以使用 FileSystemObject 從磁盤讀取 HTML 文件或使用 XML 進(jìn)行早期調(diào)整(英文)。

技巧 4:避免在 Application 或 Session 對(duì)象中緩存非靈活組件

雖然在 Application 或 Session 對(duì)象中緩存數(shù)據(jù)是個(gè)好主意,但是緩存 COM 對(duì)象可能有嚴(yán)重缺陷。將常用 COM 對(duì)象嵌入 Application 或 Session 對(duì)象通常具有吸引力。遺憾的是,很多 COM 對(duì)象,包括用 Visual Basic 6.0 或更早版本編寫的 COM 對(duì)象,在 Application 或 Session 對(duì)象中存儲(chǔ)時(shí)將導(dǎo)致嚴(yán)重的瓶頸。

特別是任何非靈活組件,在 Session 或 Application 對(duì)象中緩存時(shí)將導(dǎo)致性能瓶頸。靈活組件是標(biāo)記為 ThreadingModel=Both 的組件(它聚集了自由線程匯集器 (FTM))或標(biāo)記為 ThreadingModel=Neutral 的組件(Windows(R) 2000 和 COM+ 中新增的“中性”模型。)下列組件是非靈活的:

自由線程組件(除非它們聚集了 FTM)。
單元線程組件。
單線程組件。
已配置組件(Microsoft Transaction Server (MTS)/COM+ 庫(kù)和服務(wù)器包/應(yīng)用程序)為非靈活組件,除非它們是“中性”線程的。單元線程組件和其他非靈活組件最適于在頁(yè)作用域工作(也就是說,它們?cè)趩蝹(gè) ASP 頁(yè)上創(chuàng)建和銷毀)。

在 IIS 4.0 中,標(biāo)記為 ThreadingModel=Both 的組件被視為靈活的。在 IIS 5.0 中,這已經(jīng)不夠了。組件不僅必須標(biāo)記為 Both,而且還必須聚集 FTM。靈活性文章說明了如何使得用“活動(dòng)模板庫(kù)”編寫的 C++ 組件聚集 FTM。請(qǐng)注意,如果組件緩存接口指針,這些指針本身必須為靈活的、或者必須存儲(chǔ)在“COM 全局接口表 (GIT)”中。如果不能重新編譯 Both 線程組件,使它聚集 FTM,則可以將該組件標(biāo)記為 ThreadingModel=Neutral。另外,如果不希望 IIS 進(jìn)行靈活性檢查(這樣,希望非靈活組件能夠存儲(chǔ)在 Application 或 Session 作用域中),可以在 metabase 中設(shè)置 AspTrackThreadingModel 為 True。不主張更改 AspTrackThreadingModel。

如果試圖在 Application 對(duì)象中存儲(chǔ)用 Server.CreateObject 創(chuàng)建的非靈活組件,IIS 5.0 將產(chǎn)生錯(cuò)誤?梢酝ㄟ^在 Global.asa 中使用 <object runat=server scope=application ...> 解決該問題,但是不主張這樣做,因?yàn)檫@將導(dǎo)致匯集和串行化,說明如下。

如果緩存非靈活組件,會(huì)發(fā)生什么錯(cuò)誤呢?緩存在 Session 對(duì)象中的非靈活組件,將把會(huì)話“鎖定”到某個(gè) ASP 工作器線程。ASP 維護(hù)著一個(gè)工作器線程池,它向請(qǐng)求提供服務(wù)。通常,新的請(qǐng)求由第一個(gè)可用的工作器線程來處理。如果 Session 被鎖定到某個(gè)線程,則該請(qǐng)求將不得不等待它所關(guān)聯(lián)的線程變?yōu)榭捎。打個(gè)比方:您進(jìn)入一個(gè)超市,挑選了一些食品,然后在第 3 號(hào)收款臺(tái)交款。從這以后,每當(dāng)您在這個(gè)超市購(gòu)買食品,都不得不始終在第 3 號(hào)收款臺(tái)交款,即使是在其他收款臺(tái)人少或沒人時(shí)。

將非靈活組件存儲(chǔ)在 Applicaton 作用域甚至?xí)䦟?duì)性能產(chǎn)生更嚴(yán)重的影響。ASP 將不得不創(chuàng)建專用的線程來運(yùn)行非靈活的、Applicaton 作用域內(nèi)的組件。這將導(dǎo)致兩種后果:所有調(diào)用不得不被匯集到該線程,而且所有調(diào)用被串行化。匯集意味著:參數(shù)不得不存儲(chǔ)在內(nèi)存的共享區(qū);對(duì)該專用線程執(zhí)行昂貴的上下文切換;組件的方法被執(zhí)行;結(jié)果匯集到共享區(qū)域;以及經(jīng)過另一個(gè)昂貴的上下文切換,使控制權(quán)返回原來的線程。串行化意味著所有方法必須一個(gè)挨一個(gè)地運(yùn)行(同一時(shí)刻只能運(yùn)行一個(gè)方法)。兩個(gè)不同的 ASP 工作器線程不可能同時(shí)執(zhí)行共享組件上的方法。這將扼殺并行機(jī)制,尤其是在多處理器計(jì)算機(jī)上。更壞的是,所有非靈活的、Application 作用域內(nèi)的組件都將共享一個(gè)線程(“Host STA”),所以串行化的影響更加嚴(yán)重。

是否感到困惑?下面我們提出幾個(gè)通用規(guī)則。如果您正在用 Visual Basic (6.0) 或更早版本編寫對(duì)象,請(qǐng)不要將它們緩存在 Application 或 Session 對(duì)象中。如果您不知道對(duì)象的線程模型,就不要緩存它。不要緩存非靈活對(duì)象,而應(yīng)當(dāng)在每頁(yè)上創(chuàng)建并釋放它們。對(duì)象將直接運(yùn)行在 ASP 工作器線程上,這樣,將不會(huì)發(fā)生匯集或串行化。如果 COM 對(duì)象正運(yùn)行在 IIS 框中,而且如果它們沒有花很長(zhǎng)時(shí)間來初始化和取消,性能將是足夠的。注意,不要用該方法使用單線程對(duì)象。小心:VB 可以創(chuàng)建單線程的對(duì)象!如果您必須以該方式使用單線程的對(duì)象(如 Microsoft Excel 電子表格),則不要期望有很高的吞吐量。

當(dāng) ADO 被標(biāo)記為自由線程時(shí),則緩存 ADO 記錄集是安全的。要將 ADO 標(biāo)記為自由線程,請(qǐng)使用 Makfre15.bat 文件,該文件通常位于如下目錄中:\\Program Files\Common\System\ADO。

警告: 如果您正在用 Microsoft Access 作為數(shù)據(jù)庫(kù),則不應(yīng)當(dāng)將 ADO 標(biāo)記為自由線程。通常,ADO 記錄集還必須是斷開連接的,如果您不能控制站點(diǎn)的 ADO 配置(例如,您是獨(dú)立的軟件廠商 [ISV],將 Web 應(yīng)用程序賣給客戶,然后由他們來管理他們自己的配置),那么不緩存記錄集可能會(huì)更好。

詞典組件也是靈活對(duì)象。LookupTable 從數(shù)據(jù)文件加載它的數(shù)據(jù),并且它對(duì)組合框數(shù)據(jù)和配置信息是有用的。來自 Duwamish Books 的 PageCache 對(duì)象提供了目錄語(yǔ)義,和 Caprock Dictionary 的表現(xiàn)一樣。這些對(duì)象或它們的派生對(duì)象可以構(gòu)成有效緩存策略的基礎(chǔ)。注意,Scripting.Dictionary 對(duì)象不是靈活的,所以不應(yīng)當(dāng)存儲(chǔ)在 Application 或 Session 作用域。

技巧 5:不要在 Application 或 Session 對(duì)象中緩存數(shù)據(jù)庫(kù)連接

緩存 ADO 連接通常是不好的策略。如果一個(gè) Connection 對(duì)象存儲(chǔ)在 Application 中,并在所有頁(yè)上使用,那么所有頁(yè)將競(jìng)爭(zhēng)使用該連接。如果 Connection 對(duì)象存儲(chǔ)在 ASP Session 對(duì)象中,那么將為每個(gè)用戶創(chuàng)建數(shù)據(jù)庫(kù)連接。這將連接池的好處毀于一旦,并對(duì) Web 服務(wù)器和數(shù)據(jù)庫(kù)產(chǎn)生不必要的壓力。

取代緩存數(shù)據(jù)庫(kù)連接的方法是,在每個(gè)使用 ADO 的 ASP 頁(yè)上創(chuàng)建并取消 ADO 對(duì)象。這是個(gè)有效的方法,因?yàn)?IIS 具有內(nèi)置的數(shù)據(jù)庫(kù)連接池。更準(zhǔn)確的說,IIS 自動(dòng)啟用 OLEDB 和 ODBC 連接池。這確保了創(chuàng)建并取消每個(gè)頁(yè)上的連接將是有效的。

由于被連接的記錄集中存儲(chǔ)有對(duì)數(shù)據(jù)庫(kù)連接的引用,所以,不應(yīng)當(dāng)在 Application 或 Session 對(duì)象中緩存被連接的記錄集。但是,可以安全地緩存斷開連接的記錄集,因?yàn)樗话瑢?duì)其數(shù)據(jù)連接的引用。要斷開記錄集的連接,請(qǐng)執(zhí)行如下兩個(gè)步驟:

    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.CursorLocation = adUseClient  ' 第 1 步

    ' 植入帶數(shù)據(jù)的記錄集
    rs.Open strQuery, strProv

    ' 現(xiàn)在斷開記錄集同數(shù)據(jù)提供者和數(shù)據(jù)源的連接
    rs.ActiveConnection = Nothing    ' 第 2 步

有關(guān)連接池的詳細(xì)信息,請(qǐng)參閱 ADO 和 SQL Server(英文)引用。