主頁 > 知識庫 > 改進性能和樣式的 24個 ASP 技巧第1/2頁

改進性能和樣式的 24個 ASP 技巧第1/2頁

熱門標簽:武夷山旅游地圖標注 修改地圖標注 萊西電子地圖標注 鳳臺百度地圖標注店 個人可以辦理400電話么 縣域地圖標注打印店 金昌電話機器人價格 外呼系統(tǒng)API接口 怎么在地圖標注自己
祥細內(nèi)容:
簡介 

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

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

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

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

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

技巧 6:妙用 Session 對象 

技巧 7:在 COM 對象中封裝代碼 

技巧 8:晚點獲取資源,早點釋放資源 

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

技巧 10:顯式使用選項 

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

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

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

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

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

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

技巧 17:使用 OBJECT> 標記實例化對象 

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

技巧 19:利用瀏覽器的驗證能力 

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

技巧 21:啟用瀏覽器和代理緩存 

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

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

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


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

簡介 

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

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

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

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

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

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

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

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

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

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

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


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

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

數(shù)據(jù)應(yīng)該以什么格式存儲?任何變量類型均可存儲,因為所有腳本變量是各不相同的。例如,可以存儲字符串、整型或數(shù)組。通常,您將以這些變量類型之一存儲 ADO 記錄集的內(nèi)容。若要獲取 ADO 記錄集衍生的數(shù)據(jù),可以手工將數(shù)據(jù)復(fù)制到 VBScript 變量中,每次一個字段。使用一個 ADO 記錄集保留函數(shù) GetRows()、GetString() 或 Save() (ADO 2.5),會更快更簡便。完整而詳細的內(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ù)組返回數(shù)據(jù) 
rs.Close 
Set rs = Nothing 
End Function 

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

' 取記錄集,以"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 ' 以字符串返回數(shù)據(jù) 
End Function 

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

ADO 必須為標記的自由線程 
必須使用斷開連接的記錄集。 
如果不能保證滿足這兩個要求,請不要緩存 ADO 記錄集。在下面的非靈活組件和不要緩存連接技巧中,我們將討論在 Application 或 Session 作用域中存儲 COM 對象的危險。 

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


' 未顯示錯誤處理... 
Const update_INTERVAL = 300 ' 刷新時間間隔,以秒計 

' 函數(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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

由于被連接的記錄集中存儲有對數(shù)據(jù)庫連接的引用,所以,不應(yīng)當(dāng)在 Application 或 Session 對象中緩存被連接的記錄集。但是,可以安全地緩存斷開連接的記錄集,因為它不包含對其數(shù)據(jù)連接的引用。要斷開記錄集的連接,請執(zhí)行如下兩個步驟: 

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)連接池的詳細信息,請參閱 ADO 和 SQL Server(英文)引用。 

技巧 6:妙用 Session 對象 

在肯定了在 Applications 和 Sessions 中緩存的優(yōu)點之后,我們建議您避免使用 Session 對象。下面將會談到,當(dāng)用于忙碌站點時,Sessions 有幾個缺點。所謂忙碌,通常是指站點每秒請求數(shù)百頁或同時有數(shù)千個用戶。該技巧對于必須進行水平擴展的站點,即那些利用多個服務(wù)器來適應(yīng)負載或執(zhí)行容錯功能的站點來說,更加重要。對于較小的站點,如 intranet 站點,Sessions 的便利,與開銷相比也是值得的。 

為了翻新,ASP 自動為每個訪問 Web 服務(wù)器的用戶創(chuàng)建一個 Session。每個 Session 有大約 10 KB 內(nèi)存開銷(在存儲在 Session 中的任何數(shù)據(jù)中是最高的),并使所有的請求都慢了一點。Session 一直保持活動狀態(tài),直到達到可配置的超時(通常 20 分鐘)為止。 

Session 最大的問題不是性能而是可伸縮性。Session 不能跨越 Web 服務(wù)器;一旦在一個服務(wù)器上創(chuàng)建了 Session,它的數(shù)據(jù)就保持在那里。這意味著,如果您在 Web 領(lǐng)域中使用 Sessions,您將不得不為每個用戶的請求設(shè)計一種策略,以便始終將這些請求引向用戶的 Session 所在的服務(wù)器。這被稱為將用戶"粘"到 Web 服務(wù)器上。術(shù)語"粘性會話"即來源于此。由于 Session 沒有保持到磁盤上,所以,當(dāng) Web 服務(wù)器崩潰時,被"粘住"的用戶將丟失他們的 Sessions 狀態(tài)。 

用于實施粘性會話的策略包括硬件和軟件解決方案。如 Windows 2000 Advanced Server 中的網(wǎng)絡(luò)負載平衡解決方案和 Cisco 公司的"本地指向器"解決方案可以實施粘性會話,但以犧牲一些可伸縮性為代價。這些解決方案并不完美。我們不主張您現(xiàn)在全盤推翻您的軟件解決方案(我們過去常用 ISAPI 篩選器和 URL 矯直對方案進行檢查)。 

Application 對象也不能跨越服務(wù)器;如果您需要在 Web 領(lǐng)域內(nèi)共享并更新 Application 數(shù)據(jù),則需要使用后端數(shù)據(jù)庫。但只讀的 Application 數(shù)據(jù)在 Web 領(lǐng)域中仍然有用。 

如果只是為了增加正常運行時間(用于處理故障轉(zhuǎn)移和服務(wù)器維護),大多數(shù)執(zhí)行重要任務(wù)的站點將需要部署至少兩臺 Web 服務(wù)器。所以,在設(shè)計執(zhí)行重要任務(wù)的應(yīng)用程序時,您將需要實施"粘性會話",或者簡單地避開 Sessions 以及其他任何在單個 Web 服務(wù)器上存儲用戶狀態(tài)的狀態(tài)管理技術(shù)。 

如果當(dāng)前沒有使用 Sessions,請確保將它們關(guān)閉??梢酝ㄟ^"Internet 服務(wù)管理器"(請參閱 ISM 文檔)來為應(yīng)用程序執(zhí)行該操作。如果決定使用 Sessions,可以采取幾個方法來將對性能的影響降低到最小。 

可以將不需要 Sessions 的內(nèi)容(如"幫助"屏幕、訪問者區(qū)域等)移動到關(guān)閉了 Sessions 的、單獨的 ASP 應(yīng)用程序中??梢灾痦撎崾?nbsp;ASP:在給定的頁中您不需要 Session 對象;使用位于 ASP 頁頂端的如下指令: 

% @EnableSessionState=False %> 

使用該指令的一個很好的原因是,Session 給框架集帶來了有趣的問題。ASP 保證任何時候只執(zhí)行一個來自 Session 的請求。這樣可以確保如果瀏覽器為一個用戶請求了多個頁時,在每一時刻只有一個 ASP 請求將進入 Session;這就避免了在訪問 Session 對象時出現(xiàn)多線程問題。遺憾的是,結(jié)果,框架集中的所有頁均被以串行化方式繪制,一個接一個地,而不是同時地。這樣,用戶可能不得不等待很長時間才能得到所有框架內(nèi)容。這意味著:如果某些框架頁不信任 Session,一定要使用 
@EnableSessionState=False 
指令告訴 ASP。 

作為使用 Session 對象的替代方式,有很多方法可以用來管理 Session 狀態(tài)。對于狀態(tài)數(shù)量較小的情況(不到 4 KB),通常建議使用 Cookies、QueryString 變量和隱藏形式的變量。對于較大數(shù)量的數(shù)據(jù),如購物推車,則使用后端數(shù)據(jù)庫是最合適的選擇。關(guān)于在 Web 服務(wù)器領(lǐng)域中的狀態(tài)管理技術(shù)已經(jīng)有很多資料。詳細信息,請參閱 會話狀態(tài)(英文)。 

技巧 7:在 COM 對象中封裝代碼 

如果您有很多 VBScript 或 JScript,那么您可以通過把代碼移動到已編譯的 COM 對象來經(jīng)常改進它們的性能。已編譯的代碼通常比被解釋代碼運行得更快。已編譯的 COM 對象可以通過"早期綁定"訪問其他 COM 對象,這種調(diào)用 COM 對象方法的手段,比腳本所使用的"后期綁定"更有效。 

將代碼封裝在 COM 對象種有如下好處(超越性能): 

COM 對象是將表達邏輯與業(yè)務(wù)邏輯分隔開來的好辦法。 
COM 對象啟用了代碼重用。 
很多開發(fā)商發(fā)現(xiàn),用 VB、C++ 或 Visual J++ 書寫的代碼,比 ASP 更容易調(diào)試。 
COM 對象有一些缺點,包括初始開發(fā)時間以及需要不同的編程技巧。需要警告您的是,封裝"少"量的 ASP 可能會導(dǎo)致性能降低,而不是提高。通常,在少量 ASP 代碼封裝到 COM 對象時出現(xiàn)這樣的情況。這時候,創(chuàng)建和調(diào)用 COM 對象的開銷,超過了已編譯代碼的好處。至于 ASP 腳本和 COM 對象代碼怎樣合并才能產(chǎn)生最佳性能還有待測試。注意,與 Windows NT(R) 4.0/IIS 4.0 相比,Microsoft 已經(jīng)在 Windows 2000/IIS 5.0 中極大地提高了腳本和 ADO 性能。這樣,已編譯代碼對 ASP 代碼的性能優(yōu)勢已經(jīng)隨著 IIS 5.0 的引入而降低。 

有關(guān)在 ASP 中使用 COM 對象的優(yōu)缺點的更多討論,請參閱 ASP 組件準則和用 COM 和 Microsoft Visual Basic 6.0 對分布式應(yīng)用程序進行編程(英文)。如果您的確部署了 COM 組件,要對它們進行強度測試是非常重要的。實際上,所有 ASP 應(yīng)用程序都應(yīng)當(dāng)作為正式過程進行強度測試。 

技巧 8:晚點獲取資源,早點釋放資源 

這是個小技巧。通常,最好晚點獲取資源而要早點釋放資源。這些資源包括 COM 對象、文件句柄和其他資源。 

ADO 連接和記錄集是這種優(yōu)化的首要目標。當(dāng)您使用完記錄集,就是說用它的數(shù)據(jù)打印完一個表格后,請立即將它釋放,而不是等到頁的末尾。將您的 VBScript 變量設(shè)置為 
Nothing 
是最好的做法。不要讓記錄集簡單地脫離作用域。同時,應(yīng)當(dāng)釋放任何有關(guān)的 Command 或 Connection 對象。(不要忘了對記錄集或"連接"調(diào)用 
Close() 
,在將它們設(shè)置為 
= Nothing 
之前。)這將縮短數(shù)據(jù)庫必須為您調(diào)整資源的時間跨度,并將數(shù)據(jù)庫連接盡可能快地釋放給連接池。 
12下一頁閱讀全文

標簽:赤峰 南京 通遼 楚雄 上海 清遠 涼山 邢臺

巨人網(wǎng)絡(luò)通訊聲明:本文標題《改進性能和樣式的 24個 ASP 技巧第1/2頁》,本文關(guān)鍵詞  改進,性能,和,樣式,的,24個,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《改進性能和樣式的 24個 ASP 技巧第1/2頁》相關(guān)的同類信息!
  • 本頁收集關(guān)于改進性能和樣式的 24個 ASP 技巧第1/2頁的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章