狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

微軟建議的ASP性能優化28條守則(1)

admin
2010年7月3日 13:25 本文熱度 6687
[p]本文介紹了優化 asp 應用程序和 visual basic® scripting edition (vbscript) 的技巧。本文討論了許多陷阱。本文列出的建議已經在 [url=http://microsoft.com/]http://microsoft.com[/url] 和其它站點中進行了測試,效果十分顯著。本文假定您已經對 asp 開發,包括 vbscript 和/或 jscript、asp application、asp session 和其它 asp 固有對象(request、response 和 server)有了基本了解。[/p]
[p]通常,asp 性能主要取決于 asp 代碼本身以外的很多因素。我們不在一篇文章中羅列出所有的信息,在本文結尾處我們列出了與性能有關的資源。這些鏈接涵蓋了 asp 和非 asp 主題,包括 activex® 數據對象 (ado)、組件對象模型 (com)、數據庫和 internet information server (iis) 配置。這些都是我們喜歡的一些鏈接 - 一定要去看看。[/p]
[p][b]技巧 1:將經常使用的數據緩存在 web 服務器上[/b][/p]
[p]  典型的 asp 頁從后端數據存儲中檢索數據,然后將結果轉換成超文本標記語言 (html)。無論數據庫的速度如何,從內存中檢索數據總要比從后端數據存儲中檢索數據快得多。從本地硬盤讀取數據通常也比從數據庫中檢索數據更快。因此,通常可以將數據緩存在 web 服務器上(存儲在內存或磁盤中),來提高性能。[/p]
[p]  緩存是傳統的以空間換取時間的做法。如果您緩存的內容正確,那么您可以看到性能會有顯著的提高。為使緩存有效,必須保存那些經常重復使用的數據,且要重新計算這些數據需要(適度)大的開銷。如果緩存的都是些陳舊的數據,就會造成內存浪費。[/p]
[p]  不經常發生改變的數據是很好的緩存候選數據,因為您不必擔心隨著時間的遷移該數據與數據庫同步的問題。組合框列表、引用表、dhtml 碎片、擴展標記語言 (xml) 字符串、菜單項和站點配置變量(包括數據源名稱 (dsn)、internet 協議 (ip) 地址和 web 路徑)都是很好的緩存候選內容。注意您可以緩存數據的“表示”,而不緩存數據本身。如果 asp 頁很少更改,且緩存的開銷也很大(例如,整個產品目錄),則應考慮事先產生 html,而不是在響應每個請求時重新顯示。[/p]
[p]  應將數據緩存在哪里,有哪些緩存策略?通常,數據緩存在 web 服務器的內存或磁盤中。下兩個技巧講述了這兩個方法。[/p]
[p][b]技巧 2: 將經常使用的數據緩存在 application 或 session 對象中[/b][/p]
[p]  asp application 和 session 對象為將數據緩存在內存中提供了方便的容器。您可以將數據指派到 application 和 session 對象中,這些數據在 http 調用之間保留在內存中。session 數據是按每個用戶分別存儲的,而 application 數據則在所有用戶之間共享。[/p]
[p]  什么時候將數據裝載到 application 或 session 中呢?通常,數據是在啟動 application 或 session 時裝載。要在 application 或 session 啟動過程中裝載數據,應將適當的代碼分別添加到 application_onstart() 或 session_onstart() 中。這些函數應在 global.asa 中,如果沒有,則可以添加這些函數。還可以在第一次需要時裝載該數據。為此,在 asp 頁中添加一些代碼(或編寫一個可重復使用的腳本函數),以檢查數據是否存在,如果不存在,就裝載數據。這是一個傳統的性能技術,稱為“惰性計算” - 在您知道需要某一個值以前不計算該值。例如:[/p]
[p]<% [br]function getemploymentstatuslist [br]dim d [br]d = application(?employmentstatuslist?) [br]if d = ?? then [br]' fetchemploymentstatuslist function (not shown) [br]' fetches data from db, returns an array [br]d = fetchemploymentstatuslist() [br]application(?employmentstatuslist?) = d [br]end if [br]getemploymentstatuslist = d [br]end function [br]%>[/p]
[p]  可以為所需要的每個數據塊編寫類似的函數。[/p]
[p]  應以什么格式存儲數據?可以存儲任何變體類型,因為所有腳本變量都是變體型。例如,您可以存儲字符串、整數或數組。通常,您將以這些變量類型之一存儲 ado 記錄集的內容。要從 ado 記錄集獲取數據,您可以手工將數據復制到 vbscript 變量,一次一個字段。使用一個 ado 記錄集持久函數 getrows()、getstring() 或 save()(ado 2.5),可加快速度且更容易一些。其詳細情況已超出本文所討論的范圍,但下面給出了一個函數舉例,說明使用 getrows() 返回記錄集數據的一個數組:[/p]
[p]' get recordset, return as an array [br]function fetchemploymentstatuslist [br]dim rs [br]set rs = createobject(?adodb.recordset?) [br]rs.open ?select statusname, statusid from employeestatus?, _ [br]?dsn=employees;uid=sa;pwd=;? [br]fetchemploymentstatuslist = rs.getrows() ? return data as an array [br]rs.close [br]set rs = nothing [br]end function[/p]
[p][br]  對上面舉例做更進一步改進,可以將 html 緩存為列表,而不是數組。下面是簡單的示例:[/p]
[p]' get recordset, return as html option list [br]function fetchemploymentstatuslist [br]dim rs, fldname, s [br]set rs = createobject(?adodb.recordset?) [br]rs.open ?select statusname, statusid from employeestatus?, _ [br]?dsn=employees;uid=sa;pwd=;? [br]s = ?? & vbcrlf [br]rs.close [br]set rs = nothing ' see release early [br]fetchemploymentstatuslist = s ' return data as a string [br]end function[/p]
[p]  在適當的條件下,可以將 ado 記錄集本身緩存在 application 或 session 作用域中。有兩個警告:[/p]
[p]  必須將 ado 標記為自由線程 [br]  必須使用斷開連接的記錄集。 [br]  如果不能保證滿足這兩個要求,則不要緩存 ado 記錄集。在下面的“非敏捷組件”和“不要緩存連接”技巧中,我們將討論將 com 對象存儲在 application 或 session 作用域中的危險性。[/p]
[p]  當您將數據存儲在 application 或 session 作用域時,數據將保留在那里,直到您以編程方式改變它、session 過期或 web 應用程序重新啟動為止。如果數據需要更新怎么辦?要手工強制對 application 數據進行更新,您可以訪問只有管理員才可訪問的 asp 頁來更新數據。或者,您可以通過函數定期自動刷新數據。下面例子存儲帶有緩存數據的時間戳,并隔一段時間后刷新數據。[/p]
[p]<% [br]' error handing not shown... [br]const update_interval = 300 ' refresh interval, in seconds [br][br]' function to return the employment status list [br]function getemploymentstatuslist [br]updateemploymentstatus [br]getemploymentstatuslist = application(?employmentstatuslist?) [br]end function [br][br]' periodically update the cached data [br]sub updateemploymentstatuslist [br]dim d, strlastupdate [br]strlastupdate = application(?lastupdate?) [br]if (strlastupdate = ??) or _ [br](update_interval < datediff(?s?, strlastupdate, now)) then [br][br]' note: two or more calls might get in here. this is okay and will simply [br]' result in a few unnecessary fetches (there is a workaround for this) [br][br]' fetchemploymentstatuslist function (not shown) [br]' fetches data from db, returns an array [br]d = fetchemploymentstatuslist() [br][br]' update the application object. use application.lock() [br]' to ensure consistent data [br]application.lock [br]application(?employmentstatuslist?) = events [br]application(?lastupdate?) = cstr(now) [br]application.unlock [br]end if [br]end sub[/p]
[p]  請參見 world's fastest listbox with application data,上面還有一個例子。[/p]
[p]  要知道在 session 或 application 對象中緩存大的數組不是一個好的做法。在訪問數組的任何元素之前,腳本語言的語法要求必須臨時復制整個數組。例如,如果將由字符串組成的有 100,000 個元素的數組(該數組將美國郵政編碼映射到當地的氣象站)緩存在 application 對象中,asp 必須先將所有的 100,000 個氣象站復制到臨時數組中,然后才能提取一個字符串。在這種情況下,用自定義方法建立一個自定義組件來存儲氣象站 - 或使用一個詞典組件會更好。[/p]
[p]  再警告大家一下,不要將嬰兒與洗澡水一起倒掉:數組能快速查尋和存儲在內存中是鄰近的關鍵數據對。索引一個詞典比索引一個數組要慢得多。應針對您的實際情況,選擇提供最佳性能的數據結構。[/p]
[p]#p#[/p]
[p][b]技巧 3:將數據和 html 緩存在 web 服務器的磁盤上[/b][/p]
[p]  有時,數據可能太多,無法都緩存在內存中。“太多”只是一個說法,這要看您想消耗多少內存,以及需緩存的項目數和檢索這些項目的頻率。在任何情況下,如果數據太多而無法都緩存在內存中,則考慮將數據以文本或 xml 文件緩存在 web 服務器的硬盤上。可以同時將數據緩存在磁盤和內存中,為您的站點建立最適宜的緩存策略。[/p]
[p]  注意當測量單個 asp 頁的性能時,檢索磁盤上的數據可能不一定要比從數據庫檢索數據更快。但緩存會降低數據庫和網絡上的負載。在高負載的情況下,這樣做可大大改善總體吞吐量。當緩存開銷很大的查詢結果(如多表聯接或復合存儲過程)或大的結果集時,這是非常有效的。與往常一樣,要測試一下幾種方案的優劣。[/p]
[p]  asp 和 com 提供一些建立基于磁盤的緩存方案的工具。ado 記錄集 save() 和 open() 函數保存和裝載磁盤中的記錄集。可以使用這些方法重新編寫上面 application 數據緩存技巧中的代碼示例,用文件的 save() 代替寫到 application 對象中的代碼。[/p]
[p]  有一些其它組件可以用于文件:[/p]
[p]  scripting.filesystemobject 可使您創建、讀和寫文件。 [br]  與 internet explorer 一起提供的 microsoft® xml 解析器 (msxml) 支持保存和裝載 xml 文檔。 [br]  lookuptable 對象(例如,用在 msn 上)是從磁盤裝載簡單列表的最好選擇。 [br]  最后,應考慮將數據的表示緩存在磁盤上,而不是數據本身。預先轉換的 html 可以用 .htm 或 .asp 文件存儲在磁盤上,超級鏈接可以直接指向這些文件。可以使用商用工具,如 xbuilder,或 microsoft® sql server™ internet 發布功能將產生 html 的過程自動化。或者,您可以將 html 代碼片斷放在 .asp 文件中。還可以使用 filesystemobject 從磁盤讀取 html 文件,或使用 xml 盡早轉換。[/p]
[p][b]技巧 4:避免將非敏捷的組件緩存在 application 或 session 對象中[/b][/p]
[p]  盡管將數據緩存在 application 或 session 對象中是一個好的做法,但緩存 com 對象卻有嚴重的陷阱。通常,人們傾向于將經常使用的 com 對象緩存到 application 或 session 對象中。很遺憾,許多 com 對象(包括所有以 visual basic 6.0 或更低版本編寫的對象)當存儲在 application 或 session 對象時,會引起嚴重的瓶頸。[/p]
[p]  具體來講,當任何不敏捷的組件緩存在 session 或 application 對象時,將引起性能瓶頸。敏捷的組件是被標記為 threadingmodel=both 的組件,它聚集 free-threaded marshaler (ftm);或被標記為 threadingmodel=neutral 的組件。(neutral 模型是 windows® 2000 和 com+ 的新增模型。) 下列組件不是敏捷的:[/p]
[p]  自由線程的組件(除非它們聚集 ftm)。 [br]  單元線程組件。 [br]  單線程組件。 [br]  配置的組件(microsoft transaction server (mts)/com+ 庫和服務器程序包/應用程序)不是敏捷的,除非它們是 neutral 線程。單元線程組件和其它非敏捷的組件在頁作用域內是最適合的(即,它們在單個 asp 頁上創建和銷毀)。[/p]
[p]  在 iis 4.0 中,被標記為 threadingmodel=both 的組件被認為是敏捷的。在 iis 5.0 中,只有這一點還不夠。組件必須不僅被標記 both,還必須聚集 ftm。有關敏捷性的文章講述了如何使以 active template library 編寫的 c++ 組件聚集 ftm。要注意如果組件緩存界面指針,那么那些指針本身必須是敏捷的,或必須存儲在 com 共用界面表 (git) 中。如果您不能重新編譯 both 線程組件以聚集 ftm,那么您可以將組件標記為 threadingmodel=neutral。或者,如果您不想讓 iis 執行敏捷性檢查(因此,您可以允許非敏捷的組件存儲在 application 或 session 作用域中),您可以在配置數據庫中將 asptrackthreadingmodel 設置為 true。不建議更改 asptrackthreadingmodel。[/p]
[p]  如果您想將以 server.createobject 創建的非敏捷的組件存儲在 application 對象中,iis 5.0 將出現一個錯誤。您可以在 global.asa 中使用 避免這一錯誤,但不建議這樣做,因為這會導致匯集和串行化,關于這一點將在下面講述。[/p]
[p]  如果您緩存非敏捷的組件會出現什么毛病?緩存在 session 對象中的非敏捷的組件將 session 鎖定于 asp 工作者線程。asp 維護一個工作者線程池來處理請求。通常情況下,一個新請求總是由第一個可用的工作者線程來處理。如果 session 被鎖定于一個線程,那么請求必須等到其相關的線程可用為止。這里有一個類比,也許會有所幫助:您去一家超級市場,挑選了一些商品,并在 #_3 收款臺付款。其后,每當您在那家超級市場為商品付款時,您總是必須在 #_3 收款臺付款,即使其它收款臺前排隊的人較少或者沒有人排隊,也是如此。[/p]
[p]  將非敏捷的組件存儲在 application 作用域對性能的影響甚至更壞。asp 必須創建一個特殊的線程運行存儲在 application 作用域中的非敏捷組件。這會有兩個結果:所有調用都必須匯集到此線程,且所有調用都排成長隊。“匯集”的意思是參數必須存儲在內存的共享區域;執行一個開銷很大的到特殊線程的上下文切換;執行組件的方法;將結果匯集到共享區域;執行另一個開銷很大的上下文切換,將控制返回到原始的線程。“串行化”意思是指每次只運行一個方法。兩個不同的 asp 工作者線程不能同時在共享組件上執行多個方法。這樣就杜絕了并發性,特別是在多處理器計算機上。更糟的是,所有非敏捷的 application 作用域的組件共享一個線程(主機 sta),因此串行化的影響甚至更顯著。[/p]
[p]  如之奈何?下面是一些一般的規則。如果您使用 visual basic (6.0) 或更早版本編寫對象,那么不要將它們緩存在 application 或 session 對象中。如果您不知道對象的線程模型,不要緩存它。不要緩存非敏捷的對象,而應在每個頁面創建和釋放它們。對象直接在 asp 工作者線程上運行,因此沒有匯集或串行化。如果 com 對象在 iis 服務器上運行,且如果它們不花長時間初始化和刪除,性能尚可。注意單線程對象不應該這樣使用。小心 - vb 可創建單線程對象!如果您必須這樣使用單線程對象(如 microsoft excel 電子表格),別指望會有很高的吞吐量。[/p]
[p]  當 ado 被標記為自由線程,ado 記錄集可以安全地緩存。要將 ado 標記為自由線程,使用 makfre15.bat 文件,該文件通常位于目錄 [url=file://program/]\\program[/url] files\common\system\ado 中。[/p]
[p]  警告 如果您使用 microsoft access 作為數據庫,不應將 ado 標記為自由線程的。ado 記錄集也必須切斷連接。一般來說,如果您不能控制站點中的 ado 配置(例如,您是一個獨立的軟件廠商 [isv],向管理他們自己的配置客戶銷售 web 應用程序),最好不要緩存記錄集。[/p]
[p]  詞典組件也是敏捷的對象。lookuptable 從數據文件中裝載其數據,可用于組合框數據和配置信息。duwamish books 中的 pagecache 對象可提供詞典語法,caprock dictionary 也可提供。這些對象或其派生對象可以構成有效緩存策略的基礎。注意 scripting.dictionary 對象不是敏捷的,不應該存儲在 application 或 session 作用域中。[/p]
[p][b]技巧 5:不要將數據庫連接緩存在 application 或 session 對象中[/b][/p]
[p]  緩存 ado 連接通常是很糟糕的策略。如果一個 connection 對象存儲在 application 對象中,并在所有的頁面中使用,那么所有頁面將爭搶這一連接。如果 connection 對象存儲在 asp session 對象中,那么將為每個用戶創建數據庫連接。這就會使連接池的優勢蕩然無存,并給 web 服務器和數據庫帶來不必要的壓力。[/p]
[p]  可以不緩存數據庫連接,而是在使用 ado 的每個 asp 頁面中創建和刪除 ado 對象。這是很有效的,因為 iis 內嵌了數據庫連接池。更準確地說,iis 自動啟用 oledb 和 odbc 連接池。這就能確保在每個頁面上創建和刪除連接將是有效的。[/p]
[p]  因為連接的記錄集存儲一個到數據庫連接的引用,所以您不應將連接的記錄集緩存在 application 或 session 對象中。但是,您可以安全地緩存斷開連接的記錄集,它們不保存到其數據連接的引用。要斷開記錄集連接,執行下面的兩個步驟:[/p]
[p]set rs = server.createobject(?adodb.recordset?) [br]rs.cursorlocation = aduseclient ' step 1 [br][br]' populate the recordset with data [br]rs.open strquery, strprov [br][br]' now disconnect the recordset from the data provider and data source [br]rs.activeconnection = nothing ' step 2[/p]
[p]  有關連接池的更詳細信息,可以在 ado 和 sql server 參考資料中找到。[/p]
[p][b]技巧 6:合理地使用 session 對象[/b][/p]
[p]  既然我們已經討論了緩存在 application 和 session 中的優點,現在開始討論避免使用 session 對象的問題。正如下面所討論的,當與忙的站點一起使用時,session 有幾個缺點。“忙”的意思一般是指一秒鐘要求幾百頁面或成千上萬同時用戶的站點。這個技巧對于必須水平擴展的站點 - 即,那些利用多臺服務器以處理負載或實現容錯的站點 - 甚至更重要。對于較小的站點,諸如 intranet 站點,要想實現 session 帶來的方,必然增大系統開銷。[/p]
[p]  簡言之,asp 自動為每個訪問 web 服務器的用戶創建一個 session。每個 session 大約需要 10 kb 的內存開銷(最主要的是數據存儲在 session 中),這就使所有的請求都減慢。在配置的超時時段(通常是 20 分鐘)結束以前,session 一直保留有效。[/p]
[p]  session 的最大的問題不是性能,而是可擴展性。session 不能跨越幾臺 web 服務器,一旦在一臺服務器上創建 session,其數據就留在那兒。這就意味著如果您在一個 web 服務器群使用 session,您必須設計一個策略,將每個用戶請求始終發到用戶 session 所在的那臺服務器上。這被稱為將用戶“粘”在 web 服務器上。術語“粘性會話”就是從這里派生而來的。如果 web 服務器崩潰,被“粘住的”用戶將丟失他們的會話狀態,因為會話不是粘到磁盤上。[/p]
[p]  實現粘性會話的策略包括硬件和軟件解決方案。諸如 windows 2000 advanced server 中的網絡負載平衡和 cisco 的 local director 之類的解決方案都可以實現粘性會話,代價是要損失一定程度的可擴展性。這些解決方案是不完善的。不建議此時部署您自己的軟件解決方案(我們過去常常使用 isapi 篩選器和 url 轉換等等)。[/p]
[p]  application 對象也不跨越多臺服務器,如果您必須跨越 web 服務器群共享和更新 application 數據,您必須使用后端數據庫。但是,只讀 application 數據在 web 服務器群中仍是有用的。[/p]
[p]  如果只是因為要增加運行時間(處理故障轉移和服務器維護),大多數關鍵任務站點至少需部署兩臺 web 服務器。因此,在設計關鍵任務應用程序時,必須實現“粘性會話”,或干脆避免使用 session,以及任何其它將用戶狀態存儲在單個 web 服務器上的狀態管理技術。[/p]
[p]  如果您不使用 session,一定要將它們關閉。您可以通過 internet services manager,為應用程序執行此操作(參見 ism 文檔)。如果您決定使用 session,您可以采用一些方法減輕它們對性能的影響。[/p]
[p]  您可以將不需要 session 的內容(如幫助屏幕,訪問者區域等等)移到另一個關閉了 session 的 asp 應用程序中。您可以逐頁提示 asp,您不再需要該頁面上的 session 對象,使用以下放在 asp 頁面最上面的指令:[/p]
[p]<% @enablesessionstate=false %>[/p]
[p]  使用這一指令有一個很好的理由是,這些 session 在框架集方面存在一個有意思的問題。asp 保證任何時候 session 只有一個請求執行。這樣就確保如果瀏覽器為一個用戶請求多個頁面,一次只有一個 asp 請求接觸 session,這樣就避免了當訪問 session 對象時發生的多線程問題。很遺憾,一個框架集中的所有頁面將以串行方式顯示,一個接一個,而不是同時顯示。用戶可能必須等候很長時間,才能看到所有的框架。該故事的寓意:如果某些框架集頁面不依靠 session,一定要使用 @enablesessionstate=false 指令告訴 asp。[/p]
[p]  有許多管理 session 狀態的方法,可替代 session 對象的使用。對于少量的狀態(少于 4 kb),我們通常建議使用 cookies、querystring 變量和隱式變量。對于更大數據量,如購物小車,后端數據庫是最適合的選擇。有關 web 服務器群中狀態管理技術的文章很多。有關詳細信息,請參見 session 狀態參考資料。[/p]
[p][b]技巧 7: 將代碼封裝在 com 對象中[/b][/p]
[p]  如果您有許多 vbscript 或 jscript,您可以經常將代碼移到編譯的 com 對象中,從而可改善性能。編譯的代碼通常比解釋的代碼運行得更快。編譯的 com 對象可以通過“早綁定”訪問其它 com 對象,與腳本使用的“晚綁定”相比,“早綁定”是調用 com 對象的更有效方法。[/p]
[p]  將代碼封裝在 com 對象中還有一些優點(除性能之外):[/p]
[p]  com 對象有利于將表示邏輯與業務邏輯分開。 [br]  com 對象可以保證代碼重復使用。 [br]  許多開發人員發現以 vb、c++ 或 visual j++ 編寫的代碼比 asp 更容易調試。 [br]  com 對象也有缺點,包括初始開發時間和需要不同的程序設計技巧。注意封裝少量的 asp 可能引起性能下降,而不會得到性能改進。這種情況通常在少量的 asp 代碼被封裝進 com 對象時發生。在這種情況下,創建和調用 com 對象的系統開銷超過了編譯的代碼的優點。應反復地試驗,以確定什么樣的 asp 腳本和 com 對象代碼的組合產生最好的性能。注意,與 microsoft windows nt® 4.0/iis 4.0 相比,windows 2000/iis 5.0 中在腳本和 ado 性能方面有了很大的改進。因此,隨著 iis 5.0 的推出,編譯代碼比 asp 代碼的性能優勢有所降低。[/p]
[p]  有關在 asp 中使用 com 的優點和缺點的詳細討論,參見 asp component guidelines and programming distributed applications with and microsoft visual basic 6.0。如果您部署 com 組件,以負荷對它們進行測試特別重要。事實上,理所當然應對所有的 asp 應用程序進行負荷測試。[/p]
[p]#p#[/p]
[p][b]技巧 8:遲一點獲得資源,早一點釋放資源[/b][/p]
[p]  這里是一個小技巧供您參考。一般來說,最好遲一點獲得資源,早一點釋放資源。這適用于 com 對象以及文件句柄和其它資源。[/p]
[p]  這種優化方法主要用于 ado 連接和記錄集。當您使用完記錄集,比方說在顯示一個表及其數據之后,應立即釋放它,而不是等到頁面結束時再釋放。將 vbscript 變量設置為 nothing 是最好的做法。不要讓記錄集超出作用域之外。而且,要釋放任何相關的 command 或 connection 對象(在將記錄集或連接設置為 = nothing 之前,不要忘記調用 close())。這會縮短數據庫必須為您準備資源的時間,并盡快釋放數據庫到連接池的連接。[/p]
[p][b]技巧 9:進程外執行過程以性能換取可靠性[/b][/p]
[p]  asp 和 mts/com+ 兩者都有配置選項,可使您兼顧可靠性和性能。當建立和部署應用程序時,應知道如何兼顧兩者的性能。[/p]
[p]  asp 選項 [br]  可以配置 asp 應用程序,以便以三種方法之一運行。在 iis 5.0 中,引入了“隔離級”這一術語以說明這些選項。這三個隔離級分別是低級、中級和高級:[/p]
[p]  低級隔離。這在 iis 的所有版本中都得到支持,且是最快的。它在 inetinfo.exe 中運行 asp,inetinfo.exe 是主要 iis 進程。如果 asp 應用程序崩潰,iis 也會崩潰。(要在 iis 4.0 下重新啟動 iis,web 站點管理員應使用諸如 inetmon 之類的工具監視站點,如果服務器發生故障,應啟用批處理文件以重新啟動服務器。iis 5.0 引入了可靠的重新啟動,該方法可使發生故障的服務器自動重新啟動。) [br]  中級隔離。iis 5.0 引入了這個新的級別,它被稱為進程外級別,因為 asp 在 iis 進程之外運行。在中級隔離中,被配置作為中級隔離運行的所有 asp 應用程序都共享一個進程空間。這就減少了在一臺服務器運行多個進程外 asp 應用程序所需要的進程數量。中級隔離是 iis 5.0 中的默認隔離級別。 [br]  高級隔離。在 iis 4.0 和 iis 5.0 中支持這一級別,高級隔離也是進程外的。如果 asp 崩潰,web 服務器并不會崩潰。下次 asp 請求時,asp 應用程序就會自動重新啟動。在高級隔離中,配置作為高級隔離運行的每個 asp 應用程序都在其自有進程空間中運行。這樣做可保護 asp 應用程序彼此之間不相互干擾。其缺點是它要求每個 asp 應用程序都要有一個單獨的進程。當在一臺服務器上必須運行許多應用程序時,系統開銷就會大大增加。 [br]  哪個選項最好的呢?在 iis 4.0 中,進程外運行將顯著降低性能。在 iis 5.0 中,做了許多改進,將進程外運行 asp 應用程序所產生的開銷降到最低限度。事實上,在絕大多數測試中,iis 5.0 中的 asp 進程外應用程序比 iis 4.0 中的進程內應用程序運行得更快。不管怎樣,在兩個平臺上,進程內(低隔離級)性能最佳。但是,如果訪問率相對較低或最大吞吐量較低,低隔離級的優勢不太明顯。因此,在您每一 web 服務器每秒鐘需要數百或成千上萬頁面時,才會覺得有必要設置低隔離級。與往常一樣,應對多種配置進行測試,確定您要采取哪一種折衷方案。[/p]
[p]  注意 當您運行 asp 進程外應用程序時(中級或高級隔離),它們在 nt4 中的 mts 和在 windows 2000 中的 com+ 中運行。即,在 nt4 中它們在 mtx.exe 中運行;而在 windows 2000 中,它們在 dllhost.exe 中運行。您可以在任務管理器中看到這些進程在運行。您還可以看到 iis 如何為進程外 asp 應用程序配置 mts 程序包或 com+ 應用程序。[/p]
[p]  com 選項 [br]  com 組件也有三種配置選項,雖然與 asp 選項不完全類似。com 組件可以是“未配置的”、配置為庫應用程序或配置為服務器應用程序。“未配置的”意思是指組件沒有注冊 com+。組件將在調用程序的進程空間運行,那就是說,它們是“進程內的”。庫應用程序也是進程內的,但使用 com+ 的服務,包括安全、事務和上下文支持。服務器應用程序被配置為在它們自有的進程空間內運行。[/p]
[p]  您可以看到未配置的組件比庫應用程序略有一些優勢。庫應用程序比服務器應用程序的性能優點更大。這是因為庫應用程序與 asp 在同一進程內運行,而服務器應用程序在它們的自有進程內運行。進程間的調用比進程內調用開銷更大。而且,當在進程之間傳遞諸如記錄集之類的數據時,必須在兩個進程之間復制所有的數據。[/p]
[p]  陷阱!當使用 com 服務器應用程序時,如果您在 asp 和 com 之間傳遞對象,要確保對象執行“按值匯集”或 mbv。執行 mbv 的對象將它們自己從一個進程復制到另一個進程。這比下面一種方法好,采用這種方法時,對象仍在創建者的進程中,另外一個進程反復地調用創建進程以使用該對象。切斷連接的 ado 記錄集將“按值匯集”,連接的記錄集則不然。scr

該文章在 2010/7/3 13:25:51 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved