超碰人人人人人,色婷婷综合久久久久中文一区二区,国产-第1页-浮力影院,欧美老妇另类久久久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

admin
2010年7月3日 13:25 本文熱度 7159
[p]本文介紹了優(yōu)化 asp 應(yīng)用程序和 visual basic® scripting edition (vbscript) 的技巧。本文討論了許多陷阱。本文列出的建議已經(jīng)在 [url=http://microsoft.com/]http://microsoft.com[/url] 和其它站點(diǎn)中進(jìn)行了測(cè)試,效果十分顯著。本文假定您已經(jīng)對(duì) asp 開(kāi)發(fā),包括 vbscript 和/或 jscript、asp application、asp session 和其它 asp 固有對(duì)象(request、response 和 server)有了基本了解。[/p]
[p]通常,asp 性能主要取決于 asp 代碼本身以外的很多因素。我們不在一篇文章中羅列出所有的信息,在本文結(jié)尾處我們列出了與性能有關(guān)的資源。這些鏈接涵蓋了 asp 和非 asp 主題,包括 activex® 數(shù)據(jù)對(duì)象 (ado)、組件對(duì)象模型 (com)、數(shù)據(jù)庫(kù)和 internet information server (iis) 配置。這些都是我們喜歡的一些鏈接 - 一定要去看看。[/p]
[p][b]技巧 1:將經(jīng)常使用的數(shù)據(jù)緩存在 web 服務(wù)器上[/b][/p]
[p]  典型的 asp 頁(yè)從后端數(shù)據(jù)存儲(chǔ)中檢索數(shù)據(jù),然后將結(jié)果轉(zhuǎn)換成超文本標(biāo)記語(yǔ)言 (html)。無(wú)論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存中檢索數(shù)據(jù)總要比從后端數(shù)據(jù)存儲(chǔ)中檢索數(shù)據(jù)快得多。從本地硬盤(pán)讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)更快。因此,通常可以將數(shù)據(jù)緩存在 web 服務(wù)器上(存儲(chǔ)在內(nèi)存或磁盤(pán)中),來(lái)提高性能。[/p]
[p]  緩存是傳統(tǒng)的以空間換取時(shí)間的做法。如果您緩存的內(nèi)容正確,那么您可以看到性能會(huì)有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復(fù)使用的數(shù)據(jù),且要重新計(jì)算這些數(shù)據(jù)需要(適度)大的開(kāi)銷(xiāo)。如果緩存的都是些陳舊的數(shù)據(jù),就會(huì)造成內(nèi)存浪費(fèi)。[/p]
[p]  不經(jīng)常發(fā)生改變的數(shù)據(jù)是很好的緩存候選數(shù)據(jù),因?yàn)槟槐負(fù)?dān)心隨著時(shí)間的遷移該數(shù)據(jù)與數(shù)據(jù)庫(kù)同步的問(wèn)題。組合框列表、引用表、dhtml 碎片、擴(kuò)展標(biāo)記語(yǔ)言 (xml) 字符串、菜單項(xiàng)和站點(diǎn)配置變量(包括數(shù)據(jù)源名稱 (dsn)、internet 協(xié)議 (ip) 地址和 web 路徑)都是很好的緩存候選內(nèi)容。注意您可以緩存數(shù)據(jù)的“表示”,而不緩存數(shù)據(jù)本身。如果 asp 頁(yè)很少更改,且緩存的開(kāi)銷(xiāo)也很大(例如,整個(gè)產(chǎn)品目錄),則應(yīng)考慮事先產(chǎn)生 html,而不是在響應(yīng)每個(gè)請(qǐng)求時(shí)重新顯示。[/p]
[p]  應(yīng)將數(shù)據(jù)緩存在哪里,有哪些緩存策略?通常,數(shù)據(jù)緩存在 web 服務(wù)器的內(nèi)存或磁盤(pán)中。下兩個(gè)技巧講述了這兩個(gè)方法。[/p]
[p][b]技巧 2: 將經(jīng)常使用的數(shù)據(jù)緩存在 application 或 session 對(duì)象中[/b][/p]
[p]  asp application 和 session 對(duì)象為將數(shù)據(jù)緩存在內(nèi)存中提供了方便的容器。您可以將數(shù)據(jù)指派到 application 和 session 對(duì)象中,這些數(shù)據(jù)在 http 調(diào)用之間保留在內(nèi)存中。session 數(shù)據(jù)是按每個(gè)用戶分別存儲(chǔ)的,而 application 數(shù)據(jù)則在所有用戶之間共享。[/p]
[p]  什么時(shí)候?qū)?shù)據(jù)裝載到 application 或 session 中呢?通常,數(shù)據(jù)是在啟動(dòng) application 或 session 時(shí)裝載。要在 application 或 session 啟動(dòng)過(guò)程中裝載數(shù)據(jù),應(yīng)將適當(dāng)?shù)拇a分別添加到 application_onstart() 或 session_onstart() 中。這些函數(shù)應(yīng)在 global.asa 中,如果沒(méi)有,則可以添加這些函數(shù)。還可以在第一次需要時(shí)裝載該數(shù)據(jù)。為此,在 asp 頁(yè)中添加一些代碼(或編寫(xiě)一個(gè)可重復(fù)使用的腳本函數(shù)),以檢查數(shù)據(jù)是否存在,如果不存在,就裝載數(shù)據(jù)。這是一個(gè)傳統(tǒng)的性能技術(shù),稱為“惰性計(jì)算” - 在您知道需要某一個(gè)值以前不計(jì)算該值。例如:[/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]  可以為所需要的每個(gè)數(shù)據(jù)塊編寫(xiě)類似的函數(shù)。[/p]
[p]  應(yīng)以什么格式存儲(chǔ)數(shù)據(jù)?可以存儲(chǔ)任何變體類型,因?yàn)樗心_本變量都是變體型。例如,您可以存儲(chǔ)字符串、整數(shù)或數(shù)組。通常,您將以這些變量類型之一存儲(chǔ) ado 記錄集的內(nèi)容。要從 ado 記錄集獲取數(shù)據(jù),您可以手工將數(shù)據(jù)復(fù)制到 vbscript 變量,一次一個(gè)字段。使用一個(gè) ado 記錄集持久函數(shù) getrows()、getstring() 或 save()(ado 2.5),可加快速度且更容易一些。其詳細(xì)情況已超出本文所討論的范圍,但下面給出了一個(gè)函數(shù)舉例,說(shuō)明使用 getrows() 返回記錄集數(shù)據(jù)的一個(gè)數(shù)組:[/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]  對(duì)上面舉例做更進(jìn)一步改進(jìn),可以將 html 緩存為列表,而不是數(shù)組。下面是簡(jiǎn)單的示例:[/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]  在適當(dāng)?shù)臈l件下,可以將 ado 記錄集本身緩存在 application 或 session 作用域中。有兩個(gè)警告:[/p]
[p]  必須將 ado 標(biāo)記為自由線程 [br]  必須使用斷開(kāi)連接的記錄集。 [br]  如果不能保證滿足這兩個(gè)要求,則不要緩存 ado 記錄集。在下面的“非敏捷組件”和“不要緩存連接”技巧中,我們將討論將 com 對(duì)象存儲(chǔ)在 application 或 session 作用域中的危險(xiǎn)性。[/p]
[p]  當(dāng)您將數(shù)據(jù)存儲(chǔ)在 application 或 session 作用域時(shí),數(shù)據(jù)將保留在那里,直到您以編程方式改變它、session 過(guò)期或 web 應(yīng)用程序重新啟動(dòng)為止。如果數(shù)據(jù)需要更新怎么辦?要手工強(qiáng)制對(duì) application 數(shù)據(jù)進(jìn)行更新,您可以訪問(wèn)只有管理員才可訪問(wèn)的 asp 頁(yè)來(lái)更新數(shù)據(jù)?;蛘?,您可以通過(guò)函數(shù)定期自動(dòng)刷新數(shù)據(jù)。下面例子存儲(chǔ)帶有緩存數(shù)據(jù)的時(shí)間戳,并隔一段時(shí)間后刷新數(shù)據(jù)。[/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]  請(qǐng)參見(jiàn) world's fastest listbox with application data,上面還有一個(gè)例子。[/p]
[p]  要知道在 session 或 application 對(duì)象中緩存大的數(shù)組不是一個(gè)好的做法。在訪問(wèn)數(shù)組的任何元素之前,腳本語(yǔ)言的語(yǔ)法要求必須臨時(shí)復(fù)制整個(gè)數(shù)組。例如,如果將由字符串組成的有 100,000 個(gè)元素的數(shù)組(該數(shù)組將美國(guó)郵政編碼映射到當(dāng)?shù)氐臍庀笳荆┚彺嬖?application 對(duì)象中,asp 必須先將所有的 100,000 個(gè)氣象站復(fù)制到臨時(shí)數(shù)組中,然后才能提取一個(gè)字符串。在這種情況下,用自定義方法建立一個(gè)自定義組件來(lái)存儲(chǔ)氣象站 - 或使用一個(gè)詞典組件會(huì)更好。[/p]
[p]  再警告大家一下,不要將嬰兒與洗澡水一起倒掉:數(shù)組能快速查尋和存儲(chǔ)在內(nèi)存中是鄰近的關(guān)鍵數(shù)據(jù)對(duì)。索引一個(gè)詞典比索引一個(gè)數(shù)組要慢得多。應(yīng)針對(duì)您的實(shí)際情況,選擇提供最佳性能的數(shù)據(jù)結(jié)構(gòu)。[/p]
[p]#p#[/p]
[p][b]技巧 3:將數(shù)據(jù)和 html 緩存在 web 服務(wù)器的磁盤(pán)上[/b][/p]
[p]  有時(shí),數(shù)據(jù)可能太多,無(wú)法都緩存在內(nèi)存中。“太多”只是一個(gè)說(shuō)法,這要看您想消耗多少內(nèi)存,以及需緩存的項(xiàng)目數(shù)和檢索這些項(xiàng)目的頻率。在任何情況下,如果數(shù)據(jù)太多而無(wú)法都緩存在內(nèi)存中,則考慮將數(shù)據(jù)以文本或 xml 文件緩存在 web 服務(wù)器的硬盤(pán)上??梢酝瑫r(shí)將數(shù)據(jù)緩存在磁盤(pán)和內(nèi)存中,為您的站點(diǎn)建立最適宜的緩存策略。[/p]
[p]  注意當(dāng)測(cè)量單個(gè) asp 頁(yè)的性能時(shí),檢索磁盤(pán)上的數(shù)據(jù)可能不一定要比從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)更快。但緩存會(huì)降低數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)上的負(fù)載。在高負(fù)載的情況下,這樣做可大大改善總體吞吐量。當(dāng)緩存開(kāi)銷(xiāo)很大的查詢結(jié)果(如多表聯(lián)接或復(fù)合存儲(chǔ)過(guò)程)或大的結(jié)果集時(shí),這是非常有效的。與往常一樣,要測(cè)試一下幾種方案的優(yōu)劣。[/p]
[p]  asp 和 com 提供一些建立基于磁盤(pán)的緩存方案的工具。ado 記錄集 save() 和 open() 函數(shù)保存和裝載磁盤(pán)中的記錄集??梢允褂眠@些方法重新編寫(xiě)上面 application 數(shù)據(jù)緩存技巧中的代碼示例,用文件的 save() 代替寫(xiě)到 application 對(duì)象中的代碼。[/p]
[p]  有一些其它組件可以用于文件:[/p]
[p]  scripting.filesystemobject 可使您創(chuàng)建、讀和寫(xiě)文件。 [br]  與 internet explorer 一起提供的 microsoft® xml 解析器 (msxml) 支持保存和裝載 xml 文檔。 [br]  lookuptable 對(duì)象(例如,用在 msn 上)是從磁盤(pán)裝載簡(jiǎn)單列表的最好選擇。 [br]  最后,應(yīng)考慮將數(shù)據(jù)的表示緩存在磁盤(pán)上,而不是數(shù)據(jù)本身。預(yù)先轉(zhuǎn)換的 html 可以用 .htm 或 .asp 文件存儲(chǔ)在磁盤(pán)上,超級(jí)鏈接可以直接指向這些文件??梢允褂蒙逃霉ぞ撸?xbuilder,或 microsoft® sql server™ internet 發(fā)布功能將產(chǎn)生 html 的過(guò)程自動(dòng)化。或者,您可以將 html 代碼片斷放在 .asp 文件中。還可以使用 filesystemobject 從磁盤(pán)讀取 html 文件,或使用 xml 盡早轉(zhuǎn)換。[/p]
[p][b]技巧 4:避免將非敏捷的組件緩存在 application 或 session 對(duì)象中[/b][/p]
[p]  盡管將數(shù)據(jù)緩存在 application 或 session 對(duì)象中是一個(gè)好的做法,但緩存 com 對(duì)象卻有嚴(yán)重的陷阱。通常,人們傾向于將經(jīng)常使用的 com 對(duì)象緩存到 application 或 session 對(duì)象中。很遺憾,許多 com 對(duì)象(包括所有以 visual basic 6.0 或更低版本編寫(xiě)的對(duì)象)當(dāng)存儲(chǔ)在 application 或 session 對(duì)象時(shí),會(huì)引起嚴(yán)重的瓶頸。[/p]
[p]  具體來(lái)講,當(dāng)任何不敏捷的組件緩存在 session 或 application 對(duì)象時(shí),將引起性能瓶頸。敏捷的組件是被標(biāo)記為 threadingmodel=both 的組件,它聚集 free-threaded marshaler (ftm);或被標(biāo)記為 threadingmodel=neutral 的組件。(neutral 模型是 windows® 2000 和 com+ 的新增模型。) 下列組件不是敏捷的:[/p]
[p]  自由線程的組件(除非它們聚集 ftm)。 [br]  單元線程組件。 [br]  單線程組件。 [br]  配置的組件(microsoft transaction server (mts)/com+ 庫(kù)和服務(wù)器程序包/應(yīng)用程序)不是敏捷的,除非它們是 neutral 線程。單元線程組件和其它非敏捷的組件在頁(yè)作用域內(nèi)是最適合的(即,它們?cè)趩蝹€(gè) asp 頁(yè)上創(chuàng)建和銷(xiāo)毀)。[/p]
[p]  在 iis 4.0 中,被標(biāo)記為 threadingmodel=both 的組件被認(rèn)為是敏捷的。在 iis 5.0 中,只有這一點(diǎn)還不夠。組件必須不僅被標(biāo)記 both,還必須聚集 ftm。有關(guān)敏捷性的文章講述了如何使以 active template library 編寫(xiě)的 c++ 組件聚集 ftm。要注意如果組件緩存界面指針,那么那些指針本身必須是敏捷的,或必須存儲(chǔ)在 com 共用界面表 (git) 中。如果您不能重新編譯 both 線程組件以聚集 ftm,那么您可以將組件標(biāo)記為 threadingmodel=neutral?;蛘撸绻幌胱?iis 執(zhí)行敏捷性檢查(因此,您可以允許非敏捷的組件存儲(chǔ)在 application 或 session 作用域中),您可以在配置數(shù)據(jù)庫(kù)中將 asptrackthreadingmodel 設(shè)置為 true。不建議更改 asptrackthreadingmodel。[/p]
[p]  如果您想將以 server.createobject 創(chuàng)建的非敏捷的組件存儲(chǔ)在 application 對(duì)象中,iis 5.0 將出現(xiàn)一個(gè)錯(cuò)誤。您可以在 global.asa 中使用 避免這一錯(cuò)誤,但不建議這樣做,因?yàn)檫@會(huì)導(dǎo)致匯集和串行化,關(guān)于這一點(diǎn)將在下面講述。[/p]
[p]  如果您緩存非敏捷的組件會(huì)出現(xiàn)什么毛病?緩存在 session 對(duì)象中的非敏捷的組件將 session 鎖定于 asp 工作者線程。asp 維護(hù)一個(gè)工作者線程池來(lái)處理請(qǐng)求。通常情況下,一個(gè)新請(qǐng)求總是由第一個(gè)可用的工作者線程來(lái)處理。如果 session 被鎖定于一個(gè)線程,那么請(qǐng)求必須等到其相關(guān)的線程可用為止。這里有一個(gè)類比,也許會(huì)有所幫助:您去一家超級(jí)市場(chǎng),挑選了一些商品,并在 #_3 收款臺(tái)付款。其后,每當(dāng)您在那家超級(jí)市場(chǎng)為商品付款時(shí),您總是必須在 #_3 收款臺(tái)付款,即使其它收款臺(tái)前排隊(duì)的人較少或者沒(méi)有人排隊(duì),也是如此。[/p]
[p]  將非敏捷的組件存儲(chǔ)在 application 作用域?qū)π阅艿挠绊懮踔粮鼔摹sp 必須創(chuàng)建一個(gè)特殊的線程運(yùn)行存儲(chǔ)在 application 作用域中的非敏捷組件。這會(huì)有兩個(gè)結(jié)果:所有調(diào)用都必須匯集到此線程,且所有調(diào)用都排成長(zhǎng)隊(duì)?!皡R集”的意思是參數(shù)必須存儲(chǔ)在內(nèi)存的共享區(qū)域;執(zhí)行一個(gè)開(kāi)銷(xiāo)很大的到特殊線程的上下文切換;執(zhí)行組件的方法;將結(jié)果匯集到共享區(qū)域;執(zhí)行另一個(gè)開(kāi)銷(xiāo)很大的上下文切換,將控制返回到原始的線程?!按谢币馑际侵该看沃贿\(yùn)行一個(gè)方法。兩個(gè)不同的 asp 工作者線程不能同時(shí)在共享組件上執(zhí)行多個(gè)方法。這樣就杜絕了并發(fā)性,特別是在多處理器計(jì)算機(jī)上。更糟的是,所有非敏捷的 application 作用域的組件共享一個(gè)線程(主機(jī) sta),因此串行化的影響甚至更顯著。[/p]
[p]  如之奈何?下面是一些一般的規(guī)則。如果您使用 visual basic (6.0) 或更早版本編寫(xiě)對(duì)象,那么不要將它們緩存在 application 或 session 對(duì)象中。如果您不知道對(duì)象的線程模型,不要緩存它。不要緩存非敏捷的對(duì)象,而應(yīng)在每個(gè)頁(yè)面創(chuàng)建和釋放它們。對(duì)象直接在 asp 工作者線程上運(yùn)行,因此沒(méi)有匯集或串行化。如果 com 對(duì)象在 iis 服務(wù)器上運(yùn)行,且如果它們不花長(zhǎng)時(shí)間初始化和刪除,性能尚可。注意單線程對(duì)象不應(yīng)該這樣使用。小心 - vb 可創(chuàng)建單線程對(duì)象!如果您必須這樣使用單線程對(duì)象(如 microsoft excel 電子表格),別指望會(huì)有很高的吞吐量。[/p]
[p]  當(dāng) ado 被標(biāo)記為自由線程,ado 記錄集可以安全地緩存。要將 ado 標(biāo)記為自由線程,使用 makfre15.bat 文件,該文件通常位于目錄 [url=file://program/]\\program[/url] files\common\system\ado 中。[/p]
[p]  警告 如果您使用 microsoft access 作為數(shù)據(jù)庫(kù),不應(yīng)將 ado 標(biāo)記為自由線程的。ado 記錄集也必須切斷連接。一般來(lái)說(shuō),如果您不能控制站點(diǎn)中的 ado 配置(例如,您是一個(gè)獨(dú)立的軟件廠商 [isv],向管理他們自己的配置客戶銷(xiāo)售 web 應(yīng)用程序),最好不要緩存記錄集。[/p]
[p]  詞典組件也是敏捷的對(duì)象。lookuptable 從數(shù)據(jù)文件中裝載其數(shù)據(jù),可用于組合框數(shù)據(jù)和配置信息。duwamish books 中的 pagecache 對(duì)象可提供詞典語(yǔ)法,caprock dictionary 也可提供。這些對(duì)象或其派生對(duì)象可以構(gòu)成有效緩存策略的基礎(chǔ)。注意 scripting.dictionary 對(duì)象不是敏捷的,不應(yīng)該存儲(chǔ)在 application 或 session 作用域中。[/p]
[p][b]技巧 5:不要將數(shù)據(jù)庫(kù)連接緩存在 application 或 session 對(duì)象中[/b][/p]
[p]  緩存 ado 連接通常是很糟糕的策略。如果一個(gè) connection 對(duì)象存儲(chǔ)在 application 對(duì)象中,并在所有的頁(yè)面中使用,那么所有頁(yè)面將爭(zhēng)搶這一連接。如果 connection 對(duì)象存儲(chǔ)在 asp session 對(duì)象中,那么將為每個(gè)用戶創(chuàng)建數(shù)據(jù)庫(kù)連接。這就會(huì)使連接池的優(yōu)勢(shì)蕩然無(wú)存,并給 web 服務(wù)器和數(shù)據(jù)庫(kù)帶來(lái)不必要的壓力。[/p]
[p]  可以不緩存數(shù)據(jù)庫(kù)連接,而是在使用 ado 的每個(gè) asp 頁(yè)面中創(chuàng)建和刪除 ado 對(duì)象。這是很有效的,因?yàn)?iis 內(nèi)嵌了數(shù)據(jù)庫(kù)連接池。更準(zhǔn)確地說(shuō),iis 自動(dòng)啟用 oledb 和 odbc 連接池。這就能確保在每個(gè)頁(yè)面上創(chuàng)建和刪除連接將是有效的。[/p]
[p]  因?yàn)檫B接的記錄集存儲(chǔ)一個(gè)到數(shù)據(jù)庫(kù)連接的引用,所以您不應(yīng)將連接的記錄集緩存在 application 或 session 對(duì)象中。但是,您可以安全地緩存斷開(kāi)連接的記錄集,它們不保存到其數(shù)據(jù)連接的引用。要斷開(kāi)記錄集連接,執(zhí)行下面的兩個(gè)步驟:[/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]  有關(guān)連接池的更詳細(xì)信息,可以在 ado 和 sql server 參考資料中找到。[/p]
[p][b]技巧 6:合理地使用 session 對(duì)象[/b][/p]
[p]  既然我們已經(jīng)討論了緩存在 application 和 session 中的優(yōu)點(diǎn),現(xiàn)在開(kāi)始討論避免使用 session 對(duì)象的問(wèn)題。正如下面所討論的,當(dāng)與忙的站點(diǎn)一起使用時(shí),session 有幾個(gè)缺點(diǎn)?!懊Α钡囊馑家话闶侵敢幻腌娨髱装夙?yè)面或成千上萬(wàn)同時(shí)用戶的站點(diǎn)。這個(gè)技巧對(duì)于必須水平擴(kuò)展的站點(diǎn) - 即,那些利用多臺(tái)服務(wù)器以處理負(fù)載或?qū)崿F(xiàn)容錯(cuò)的站點(diǎn) - 甚至更重要。對(duì)于較小的站點(diǎn),諸如 intranet 站點(diǎn),要想實(shí)現(xiàn) session 帶來(lái)的方,必然增大系統(tǒng)開(kāi)銷(xiāo)。[/p]
[p]  簡(jiǎn)言之,asp 自動(dòng)為每個(gè)訪問(wèn) web 服務(wù)器的用戶創(chuàng)建一個(gè) session。每個(gè) session 大約需要 10 kb 的內(nèi)存開(kāi)銷(xiāo)(最主要的是數(shù)據(jù)存儲(chǔ)在 session 中),這就使所有的請(qǐng)求都減慢。在配置的超時(shí)時(shí)段(通常是 20 分鐘)結(jié)束以前,session 一直保留有效。[/p]
[p]  session 的最大的問(wèn)題不是性能,而是可擴(kuò)展性。session 不能跨越幾臺(tái) web 服務(wù)器,一旦在一臺(tái)服務(wù)器上創(chuàng)建 session,其數(shù)據(jù)就留在那兒。這就意味著如果您在一個(gè) web 服務(wù)器群使用 session,您必須設(shè)計(jì)一個(gè)策略,將每個(gè)用戶請(qǐng)求始終發(fā)到用戶 session 所在的那臺(tái)服務(wù)器上。這被稱為將用戶“粘”在 web 服務(wù)器上。術(shù)語(yǔ)“粘性會(huì)話”就是從這里派生而來(lái)的。如果 web 服務(wù)器崩潰,被“粘住的”用戶將丟失他們的會(huì)話狀態(tài),因?yàn)闀?huì)話不是粘到磁盤(pán)上。[/p]
[p]  實(shí)現(xiàn)粘性會(huì)話的策略包括硬件和軟件解決方案。諸如 windows 2000 advanced server 中的網(wǎng)絡(luò)負(fù)載平衡和 cisco 的 local director 之類的解決方案都可以實(shí)現(xiàn)粘性會(huì)話,代價(jià)是要損失一定程度的可擴(kuò)展性。這些解決方案是不完善的。不建議此時(shí)部署您自己的軟件解決方案(我們過(guò)去常常使用 isapi 篩選器和 url 轉(zhuǎn)換等等)。[/p]
[p]  application 對(duì)象也不跨越多臺(tái)服務(wù)器,如果您必須跨越 web 服務(wù)器群共享和更新 application 數(shù)據(jù),您必須使用后端數(shù)據(jù)庫(kù)。但是,只讀 application 數(shù)據(jù)在 web 服務(wù)器群中仍是有用的。[/p]
[p]  如果只是因?yàn)橐黾舆\(yùn)行時(shí)間(處理故障轉(zhuǎn)移和服務(wù)器維護(hù)),大多數(shù)關(guān)鍵任務(wù)站點(diǎn)至少需部署兩臺(tái) web 服務(wù)器。因此,在設(shè)計(jì)關(guān)鍵任務(wù)應(yīng)用程序時(shí),必須實(shí)現(xiàn)“粘性會(huì)話”,或干脆避免使用 session,以及任何其它將用戶狀態(tài)存儲(chǔ)在單個(gè) web 服務(wù)器上的狀態(tài)管理技術(shù)。[/p]
[p]  如果您不使用 session,一定要將它們關(guān)閉。您可以通過(guò) internet services manager,為應(yīng)用程序執(zhí)行此操作(參見(jiàn) ism 文檔)。如果您決定使用 session,您可以采用一些方法減輕它們對(duì)性能的影響。[/p]
[p]  您可以將不需要 session 的內(nèi)容(如幫助屏幕,訪問(wèn)者區(qū)域等等)移到另一個(gè)關(guān)閉了 session 的 asp 應(yīng)用程序中。您可以逐頁(yè)提示 asp,您不再需要該頁(yè)面上的 session 對(duì)象,使用以下放在 asp 頁(yè)面最上面的指令:[/p]
[p]<% @enablesessionstate=false %>[/p]
[p]  使用這一指令有一個(gè)很好的理由是,這些 session 在框架集方面存在一個(gè)有意思的問(wèn)題。asp 保證任何時(shí)候 session 只有一個(gè)請(qǐng)求執(zhí)行。這樣就確保如果瀏覽器為一個(gè)用戶請(qǐng)求多個(gè)頁(yè)面,一次只有一個(gè) asp 請(qǐng)求接觸 session,這樣就避免了當(dāng)訪問(wèn) session 對(duì)象時(shí)發(fā)生的多線程問(wèn)題。很遺憾,一個(gè)框架集中的所有頁(yè)面將以串行方式顯示,一個(gè)接一個(gè),而不是同時(shí)顯示。用戶可能必須等候很長(zhǎng)時(shí)間,才能看到所有的框架。該故事的寓意:如果某些框架集頁(yè)面不依靠 session,一定要使用 @enablesessionstate=false 指令告訴 asp。[/p]
[p]  有許多管理 session 狀態(tài)的方法,可替代 session 對(duì)象的使用。對(duì)于少量的狀態(tài)(少于 4 kb),我們通常建議使用 cookies、querystring 變量和隱式變量。對(duì)于更大數(shù)據(jù)量,如購(gòu)物小車(chē),后端數(shù)據(jù)庫(kù)是最適合的選擇。有關(guān) web 服務(wù)器群中狀態(tài)管理技術(shù)的文章很多。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn) session 狀態(tài)參考資料。[/p]
[p][b]技巧 7: 將代碼封裝在 com 對(duì)象中[/b][/p]
[p]  如果您有許多 vbscript 或 jscript,您可以經(jīng)常將代碼移到編譯的 com 對(duì)象中,從而可改善性能。編譯的代碼通常比解釋的代碼運(yùn)行得更快。編譯的 com 對(duì)象可以通過(guò)“早綁定”訪問(wèn)其它 com 對(duì)象,與腳本使用的“晚綁定”相比,“早綁定”是調(diào)用 com 對(duì)象的更有效方法。[/p]
[p]  將代碼封裝在 com 對(duì)象中還有一些優(yōu)點(diǎn)(除性能之外):[/p]
[p]  com 對(duì)象有利于將表示邏輯與業(yè)務(wù)邏輯分開(kāi)。 [br]  com 對(duì)象可以保證代碼重復(fù)使用。 [br]  許多開(kāi)發(fā)人員發(fā)現(xiàn)以 vb、c++ 或 visual j++ 編寫(xiě)的代碼比 asp 更容易調(diào)試。 [br]  com 對(duì)象也有缺點(diǎn),包括初始開(kāi)發(fā)時(shí)間和需要不同的程序設(shè)計(jì)技巧。注意封裝少量的 asp 可能引起性能下降,而不會(huì)得到性能改進(jìn)。這種情況通常在少量的 asp 代碼被封裝進(jìn) com 對(duì)象時(shí)發(fā)生。在這種情況下,創(chuàng)建和調(diào)用 com 對(duì)象的系統(tǒng)開(kāi)銷(xiāo)超過(guò)了編譯的代碼的優(yōu)點(diǎn)。應(yīng)反復(fù)地試驗(yàn),以確定什么樣的 asp 腳本和 com 對(duì)象代碼的組合產(chǎn)生最好的性能。注意,與 microsoft windows nt® 4.0/iis 4.0 相比,windows 2000/iis 5.0 中在腳本和 ado 性能方面有了很大的改進(jìn)。因此,隨著 iis 5.0 的推出,編譯代碼比 asp 代碼的性能優(yōu)勢(shì)有所降低。[/p]
[p]  有關(guān)在 asp 中使用 com 的優(yōu)點(diǎn)和缺點(diǎn)的詳細(xì)討論,參見(jiàn) asp component guidelines and programming distributed applications with and microsoft visual basic 6.0。如果您部署 com 組件,以負(fù)荷對(duì)它們進(jìn)行測(cè)試特別重要。事實(shí)上,理所當(dāng)然應(yīng)對(duì)所有的 asp 應(yīng)用程序進(jìn)行負(fù)荷測(cè)試。[/p]
[p]#p#[/p]
[p][b]技巧 8:遲一點(diǎn)獲得資源,早一點(diǎn)釋放資源[/b][/p]
[p]  這里是一個(gè)小技巧供您參考。一般來(lái)說(shuō),最好遲一點(diǎn)獲得資源,早一點(diǎn)釋放資源。這適用于 com 對(duì)象以及文件句柄和其它資源。[/p]
[p]  這種優(yōu)化方法主要用于 ado 連接和記錄集。當(dāng)您使用完記錄集,比方說(shuō)在顯示一個(gè)表及其數(shù)據(jù)之后,應(yīng)立即釋放它,而不是等到頁(yè)面結(jié)束時(shí)再釋放。將 vbscript 變量設(shè)置為 nothing 是最好的做法。不要讓記錄集超出作用域之外。而且,要釋放任何相關(guān)的 command 或 connection 對(duì)象(在將記錄集或連接設(shè)置為 = nothing 之前,不要忘記調(diào)用 close())。這會(huì)縮短數(shù)據(jù)庫(kù)必須為您準(zhǔn)備資源的時(shí)間,并盡快釋放數(shù)據(jù)庫(kù)到連接池的連接。[/p]
[p][b]技巧 9:進(jìn)程外執(zhí)行過(guò)程以性能換取可靠性[/b][/p]
[p]  asp 和 mts/com+ 兩者都有配置選項(xiàng),可使您兼顧可靠性和性能。當(dāng)建立和部署應(yīng)用程序時(shí),應(yīng)知道如何兼顧兩者的性能。[/p]
[p]  asp 選項(xiàng) [br]  可以配置 asp 應(yīng)用程序,以便以三種方法之一運(yùn)行。在 iis 5.0 中,引入了“隔離級(jí)”這一術(shù)語(yǔ)以說(shuō)明這些選項(xiàng)。這三個(gè)隔離級(jí)分別是低級(jí)、中級(jí)和高級(jí):[/p]
[p]  低級(jí)隔離。這在 iis 的所有版本中都得到支持,且是最快的。它在 inetinfo.exe 中運(yùn)行 asp,inetinfo.exe 是主要 iis 進(jìn)程。如果 asp 應(yīng)用程序崩潰,iis 也會(huì)崩潰。(要在 iis 4.0 下重新啟動(dòng) iis,web 站點(diǎn)管理員應(yīng)使用諸如 inetmon 之類的工具監(jiān)視站點(diǎn),如果服務(wù)器發(fā)生故障,應(yīng)啟用批處理文件以重新啟動(dòng)服務(wù)器。iis 5.0 引入了可靠的重新啟動(dòng),該方法可使發(fā)生故障的服務(wù)器自動(dòng)重新啟動(dòng)。) [br]  中級(jí)隔離。iis 5.0 引入了這個(gè)新的級(jí)別,它被稱為進(jìn)程外級(jí)別,因?yàn)?asp 在 iis 進(jìn)程之外運(yùn)行。在中級(jí)隔離中,被配置作為中級(jí)隔離運(yùn)行的所有 asp 應(yīng)用程序都共享一個(gè)進(jìn)程空間。這就減少了在一臺(tái)服務(wù)器運(yùn)行多個(gè)進(jìn)程外 asp 應(yīng)用程序所需要的進(jìn)程數(shù)量。中級(jí)隔離是 iis 5.0 中的默認(rèn)隔離級(jí)別。 [br]  高級(jí)隔離。在 iis 4.0 和 iis 5.0 中支持這一級(jí)別,高級(jí)隔離也是進(jìn)程外的。如果 asp 崩潰,web 服務(wù)器并不會(huì)崩潰。下次 asp 請(qǐng)求時(shí),asp 應(yīng)用程序就會(huì)自動(dòng)重新啟動(dòng)。在高級(jí)隔離中,配置作為高級(jí)隔離運(yùn)行的每個(gè) asp 應(yīng)用程序都在其自有進(jìn)程空間中運(yùn)行。這樣做可保護(hù) asp 應(yīng)用程序彼此之間不相互干擾。其缺點(diǎn)是它要求每個(gè) asp 應(yīng)用程序都要有一個(gè)單獨(dú)的進(jìn)程。當(dāng)在一臺(tái)服務(wù)器上必須運(yùn)行許多應(yīng)用程序時(shí),系統(tǒng)開(kāi)銷(xiāo)就會(huì)大大增加。 [br]  哪個(gè)選項(xiàng)最好的呢?在 iis 4.0 中,進(jìn)程外運(yùn)行將顯著降低性能。在 iis 5.0 中,做了許多改進(jìn),將進(jìn)程外運(yùn)行 asp 應(yīng)用程序所產(chǎn)生的開(kāi)銷(xiāo)降到最低限度。事實(shí)上,在絕大多數(shù)測(cè)試中,iis 5.0 中的 asp 進(jìn)程外應(yīng)用程序比 iis 4.0 中的進(jìn)程內(nèi)應(yīng)用程序運(yùn)行得更快。不管怎樣,在兩個(gè)平臺(tái)上,進(jìn)程內(nèi)(低隔離級(jí))性能最佳。但是,如果訪問(wèn)率相對(duì)較低或最大吞吐量較低,低隔離級(jí)的優(yōu)勢(shì)不太明顯。因此,在您每一 web 服務(wù)器每秒鐘需要數(shù)百或成千上萬(wàn)頁(yè)面時(shí),才會(huì)覺(jué)得有必要設(shè)置低隔離級(jí)。與往常一樣,應(yīng)對(duì)多種配置進(jìn)行測(cè)試,確定您要采取哪一種折衷方案。[/p]
[p]  注意 當(dāng)您運(yùn)行 asp 進(jìn)程外應(yīng)用程序時(shí)(中級(jí)或高級(jí)隔離),它們?cè)?nt4 中的 mts 和在 windows 2000 中的 com+ 中運(yùn)行。即,在 nt4 中它們?cè)?mtx.exe 中運(yùn)行;而在 windows 2000 中,它們?cè)?dllhost.exe 中運(yùn)行。您可以在任務(wù)管理器中看到這些進(jìn)程在運(yùn)行。您還可以看到 iis 如何為進(jìn)程外 asp 應(yīng)用程序配置 mts 程序包或 com+ 應(yīng)用程序。[/p]
[p]  com 選項(xiàng) [br]  com 組件也有三種配置選項(xiàng),雖然與 asp 選項(xiàng)不完全類似。com 組件可以是“未配置的”、配置為庫(kù)應(yīng)用程序或配置為服務(wù)器應(yīng)用程序?!拔磁渲玫摹币馑际侵附M件沒(méi)有注冊(cè) com+。組件將在調(diào)用程序的進(jìn)程空間運(yùn)行,那就是說(shuō),它們是“進(jìn)程內(nèi)的”。庫(kù)應(yīng)用程序也是進(jìn)程內(nèi)的,但使用 com+ 的服務(wù),包括安全、事務(wù)和上下文支持。服務(wù)器應(yīng)用程序被配置為在它們自有的進(jìn)程空間內(nèi)運(yùn)行。[/p]
[p]  您可以看到未配置的組件比庫(kù)應(yīng)用程序略有一些優(yōu)勢(shì)。庫(kù)應(yīng)用程序比服務(wù)器應(yīng)用程序的性能優(yōu)點(diǎn)更大。這是因?yàn)閹?kù)應(yīng)用程序與 asp 在同一進(jìn)程內(nèi)運(yùn)行,而服務(wù)器應(yīng)用程序在它們的自有進(jìn)程內(nèi)運(yùn)行。進(jìn)程間的調(diào)用比進(jìn)程內(nèi)調(diào)用開(kāi)銷(xiāo)更大。而且,當(dāng)在進(jìn)程之間傳遞諸如記錄集之類的數(shù)據(jù)時(shí),必須在兩個(gè)進(jìn)程之間復(fù)制所有的數(shù)據(jù)。[/p]
[p]  陷阱!當(dāng)使用 com 服務(wù)器應(yīng)用程序時(shí),如果您在 asp 和 com 之間傳遞對(duì)象,要確保對(duì)象執(zhí)行“按值匯集”或 mbv。執(zhí)行 mbv 的對(duì)象將它們自己從一個(gè)進(jìn)程復(fù)制到另一個(gè)進(jìn)程。這比下面一種方法好,采用這種方法時(shí),對(duì)象仍在創(chuàng)建者的進(jìn)程中,另外一個(gè)進(jìn)程反復(fù)地調(diào)用創(chuàng)建進(jìn)程以使用該對(duì)象。切斷連接的 ado 記錄集將“按值匯集”,連接的記錄集則不然。scr

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