ASP技巧集錦(官方權威版)-2

來源:互聯網
上載者:User
技巧    技巧 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(英文)引用。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。