熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

提高ASP.NET應用程序性能的10大方法[2]

2013-11-13 12:16:30  來源: .NET編程 

  連接池

  用TCP來連接你的應用程序與數據庫是一件昂貴的事情(很費時的事情)微軟的開發者可以通過用連接池來反復的使用數據庫的連接比起每次請求都用TCP來連一次數據庫連接池只有在不存在有效的連接時才新建一個TCP連接當關閉一個連接的時候它會被放到池中它仍然會保持與數據庫的連接這樣就可以減少與數據庫的TCP連接次數

  當然你要注意那些忘記關的連接你應在每次用完連接後馬上關閉它我要強調的是無論什麼人說net framework中的GC(垃圾收集器)總會在你用完連接對象後調用連接對象的Close或者Dispose方法顯式的關閉你的連接不要期望CLR會在你想象的時間內關掉連接雖然CLR最終都要銷毀對象和關閉邊接但是我們並不能確定它到底會在什麼時候做這些事情

  要用連接池優化有兩條規則第一打開連接處理數據然後關閉連接如果你必須在每次請求中多次打開或關閉連接這好過一直打開一個邊接然後把它傳到各個方法中第二用相同的連接字符串(或者用相同的用戶標識當你用集成認證的時候)如果你沒有用相同的連接字符串如你用基於登錄用戶的連接字符串這將不能利用連接池的優化功能如果你用的是集成的論證因為用戶很多所以你也不能充分利用連接池的優化功能NET CLR提供了一個數據性能計數器它在我們需要跟蹤程序性能特性的時候非常有用當然也包括連接池的跟蹤了

  無論你的應用程序什麼時候要連在另一台機子的資源如數據庫你都應該重點優化你連資源所花的時間接收和發送數據的時間以及往返回之間的次數優化你的應用程序中的每一個處理點(process hop)它是提高你的應用的性能的出發點

  應用程序層包含與數據層連接傳送數據到相應的類的實例以及業務處理的邏輯例如在Community Server中要組裝一個Forums或者Threads集合然後應用業務邏輯如授權更重要的這裡要完成緩存邏輯

  ASPNET緩存API

  在寫應用程序之前你要做的第一件事是讓應用程序最大化的利用ASPNET的緩存功能

  如果你的組件是要在Aspnet應用程序中運行你只要把SystemWebdll引用到你的項目中就可以了然後用HttpRuntimeCache屬性就可訪問Cache了(也可以通過PageCache或HttpContextCache訪問)

  有以下幾條緩存數據的規則第一數據可能會被頻繁的被使用這種數據可以緩存第二數據的訪問頻率非常高或者一個數據的訪問頻率不高但是它的生存周期很長這樣的數據最好也緩存起來第三是一個常常被忽略的問題有時候我們緩存了太多數據通常在一台X的機子上如果你要緩存的數據超過M的話就會出現內存溢出的錯誤所以說緩存是有限的換名話說你應該估計緩存集的大小把緩存集的大小限制在以內否則它可能會出問題在Aspnet中如果緩存過大的話也會報內存溢出錯誤特別是如果緩存大的DataSet對象的時候

  這裡有幾個你必須了解的重要的緩存機制首先是緩存實現了最近使用原則( a leastrecentlyused algorithm)當緩存少的時候它會自動的強制清除那些無用的緩存其次 條件依賴強制清除原則(expiration dependencies)條件可以是時間關鍵字和文件以時間作為條件是最常用的在aspnet中增加一更強的條件就是數據庫條件當數據庫中的數據發生變化時就會強制清除緩存要更深入的了解數據庫條件依賴請看Dino Esposito 在MSDN雜志年七月刊的Cutting Edge專欄文章Aspnet的緩存架構如下圖所示

  預請求緩存

  在前面我提到過即使我們只對某些地方作了一個小小的性能改進也可以獲得大的性能提升我非常喜歡用預請求緩存來提升程序的性能

  雖然Cache API設計成用來保存某段時間的數據而預請求緩存只是保存某個時期的某個請求的內容如果某個請求的訪問頻率高而且這個請求只需要提取應用修改或者更新數據一次那麼就可以預緩存該請求我們舉個例子來說明

  在CS的論壇應用程序中每一個頁面的服務器控件都要求得到用於決定它的皮膚(skin)的自定義的數據以決定用哪個樣式表及其它的一些個性化的東西這裡面的某些數據可能要長時間的保存有些時間則不然如控件的skin數據它只需要應用一次而後就可以一直使用

  要實現預請求緩存用Aspnet 的HttpContext類HttpContext類的實例在每一個請求中創建在請求期間的任何地方都可以通過HttpContextCurrent屬性訪問HttpContext類有一個Items集合屬性在請求期間所有的對象和數據都被添加到這個集合中緩存起來和你用Cache緩存訪問頻率高數據一樣你可以用HttpContextItems緩存那些每個請求都要用到的基礎數據它背後的邏輯很簡單我們向HttpContextItems中添加一個數據然後再從它裡面讀出數據

  後台處理

  通過上面的方法你的應用程序應該運行得很快了是不是?但是在某些時候程序中的一次請求中可能要執行一個非常耗時的任務如發送郵件或者是檢查提交的數據的正確性等

  當我們把aspnet Forums 集成在CS中的時侯發現提交一個新的帖子的時候會非常的慢每次新增一個帖子的時侯應用程序首先要檢查這個帖子是不是重復提的然後用badword過濾器來過濾檢查圖片附加碼作帖子的索引把它添加到合適的隊列中驗證它的附件最後發郵件到它的訂閱者郵件箱中顯然這個工作量很大

[]  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15551.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.