C#基礎回顧:Asp.net 緩衝

來源:互聯網
上載者:User

      緩衝的作用
      你買電腦的時候,是否會在意CPU的二級緩衝?是不是希望二級緩衝能夠大點?那你有沒有想過你為什麼會有這種想法?說到底,就是為了效能問題,如果緩衝大點,那就意味著我們處理資料的響應速度會更快。這就好比我們查字典,如果有一個單詞,你需要知道它的意思,你是不是需要翻開字典,尋找目錄,翻到指定的頁,找到你要的單詞,這才能得到該詞的解釋?可是不幸的是,你並沒有想要去記住這個詞,當第二次遇到這個詞的時候,你是不是又得重複一遍上述的動作?如果你當時記住這個單詞,那是不是馬上就能知道這個詞的意思了?這是不是很高效?
      緩衝的缺點
      如果讓你在一個資訊無法傳達的地方(比如原始森林)呆上幾個月,而這幾個月中,發生了很多變化,其中之一就是你上次查詢的那個單詞由於某些特殊的原因,它的解釋被更換了。而你顯然不知道這個事情,如果此時此刻,讓你解釋這個單詞,你是不是會鬧笑話?這是什麼原因呢?很簡單,因為你的腦海裡只儲存著上次的解釋,而沒有及時得到更新。

      進入正題(本人並未深入研究,如有不足之處,希望大家不吝賜教)

      樣本1:
      你希不希望你的動態網站也有一個可以記憶的大腦?可能部分朋友會覺得可笑,“這有必要嗎?” 。如果你的網站牽涉到大量的資料互動,而這些資料被更新的頻率又不是很高,比如有些提供新聞資訊的網站,可能就只需要在上午9:00前對新聞進行更新,而後就不需要再更改了。那也就是說9點後使用者訪問所得到的資料都是一樣的。但是,因為沒有提供緩衝的能力,使用者的每次訪問,仍舊會導致伺服器端對資料庫的訪問,這會不會很影響效能?
      在Asp.net webform中可以通過配置頁面指令OutputCache來實現效果。在你的aspx檔案的頭部加入如下的語句:

<%@ OutputCache Duration="10" VaryByParam="none"%>

      上述主要有兩個屬性(要配置緩衝至少需要這兩個屬性):
      Duration用來定義頁面被緩衝的時間(單位為秒),也就是說在10秒內,重複訪問這個頁面將得到完全一樣的資料。
      VaryByParam表示是否因為接受請求的參數(xxx.aspx?id=1)而改變,如果設定為none,表示不改變。
      這樣,一個最簡單的緩衝效果便可以實現了。

      樣本2:
      通過上面的例子,相信你已經領略到了緩衝的魅力。但是,上面的效果無法根據頁面的參數進行緩衝,也就是說不管我傳什麼參數給頁面,顯示的都是一樣的。比如我在10秒內先後訪問xxx.aspx?id=1與xxx.aspx?id=2,其顯示的效果是一樣的。如果希望根據參數進行緩衝,只要讓VaryByParam="id"就可以了(大小寫無關)。這樣就會根據id的值不同而分別緩衝,相當於緩衝了頁的多個不同的版本。

      樣本3:
      如果需要部分不被緩衝,可以使用伺服器端控制項Substitution。操作很簡單,只需要將該控制項拖動到頁面上,然後設定一下其中的MethodName屬性就可以了。
      該控制項編譯成Html後,不帶任何標記,就如同是一個預留位置。其中顯示的是內容是由MethodName所指定的方法。但是該方法有一定的限制:
      1:靜態方法。
      2:只接受HttpContext 類型的參數。
      3:必須返回 string 類型的值。
      如:

public static string GetCurrentTime(HttpContext context)
{
    return DateTime.Now.ToString();
}

      這樣,每次頁面重新整理後就可以擷取當前的時間,而其它資料則是被緩衝的。

      樣本4:
      是不是覺得通過這種辦法實現的部分緩衝、部分重新整理的效果有很多局限。如果需要一種更靈活的方式來實現部分緩衝的效果,可以通過使用者控制項來實現。就是說,我們將需要被緩衝的資料單獨放置在一個頁面中,然後在該頁面上按照我們前面幾個例子所介紹的方法進行設定。最後把設定好的使用者控制項拖動到最終的頁面上就可以了。另外,OutputCache指令中還有一個Shared屬性,設定該屬性為true就表示共用該控制項的輸出緩衝。

<%@ OutputCache Duration="10" VaryByParam="CategoryiD" Shared="true"%>

 

      樣本5:
      ASP.NET還提供了一種更方便的方法,可以對頁面的變數進行緩衝。即利用Cache對象。一般用來快取資料變數,如DataSet。但是,如果資料量比較大的話,建議與硬碟緩衝結合起來使用。一般利用Cache對象來儲存資料庫資料可以比利用OutputCache配置效能更好。但是最好不要用Cache來存放使用者的登陸資訊之類,因為緩衝中的資料隨時都有可能被替換出記憶體(如果你掌握一些關於電腦群組成方面的原理,可能會更好理解)。

Code
//從Cache對象中擷取相應的dataset
DataSet ds = (DataSet)Cache["data"];

//判斷dataset是否為空白,如果為空白,說明沒有在緩衝中。
if (ds == null)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
    conn.Open();
    SqlCommand cmd = new SqlCommand("select * from products where CategoryID = 1", conn);
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    ds = new DataSet();
    sda.Fill(ds);
    Cache["data"] = ds;//將dataset插入到Cache對象中
}

GridView1.DataSource = ds;
GridView1.DataBind();

      樣本6:
      但是上面方式總有點欠缺,如果當資料改變的時候就自動更新緩衝,那不是更好。這可以有兩種實現方式,通知和輪詢。但是MSDN上介紹“通知”的功能只有在Microsoft SQL Server 2005 的完整版,即非速成 (non-Express) 版中才有提供。而其它版本則只提供了輪詢方式,況且我也只會輪詢方式,所以就來簡單介紹下該方式吧。

      要使用輪詢方式,需設定資料庫,配置的主要任務就是在資料庫中建立一張表和一些觸發器,在這個表中存放的是我們需要輪詢的資料庫表對象及其相關資訊,觸發器自然是用來當所監視的表發生變化的時候執行了。幸好,這一系列操作我們只需要用幾句簡單的命令就可以解決了。否則的話,我可能就會半途而廢了。
      開啟Vsiual studio的命令提示視窗,輸入:
      aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d <Database> -et -t <TableName>
      如:aspnet_regsql.exe -S .\msserver -U sa -P sa -ed -d Northwind -et -t products
      如果運行成功,會提示:

為 SQL 緩衝依賴項啟用該資料庫。
.
已完成。
為 SQL 緩衝依賴項啟用該表。

      然後,設定與SqlDependency相關的一些資訊(如,輪詢時間),這些資訊在web.config中進行設定:

放在<system.web>節點下
<caching>
  <sqlCacheDependency enabled = "true" pollTime = "1000" >
    <databases>
      <add name="Northwind" 
         connectionStringName="NorthwindConnectionString"
         pollTime = "1000" />
    </databases>
  </sqlCacheDependency>
</caching>

      其中的name只要求是一個方便記憶的名字(一般就記作資料庫的名稱),pollTime即是輪詢時間(單位:毫秒)。
      [引用MSDN中的一段話:小的 pollTime 值雖然使對資料庫的請求次數增加,但能更快的將過時資料從緩衝中清除。較大的 pollTime 值雖然減少了對資料庫的請求次數,但增加了從後台資料改變到清除相關緩衝條目之間的延遲時間。還好,資料庫請求只是執行一個簡單的預存程序,該預存程序只是從一個簡單的記錄數少的表返回不多的幾行。對您的應用程式試用一些不同的 pollTime 值,從中找出一個可平衡資料庫訪問和資料過時這兩者的理想值。允許的最小 pollTime 值為 500 。]
      connectionStringName即是<connectionStrings>節中所配置的資料庫連接名稱。如:

放在<configuration>節下
 <connectionStrings>
  <add name="NorthwindConnectionString" connectionString="Data Source=1AC425E4D0B74F1\msserver;Initial Catalog=Northwind;Integrated Security=True"
   providerName="System.Data.SqlClient" />
 </connectionStrings>

      最後修改OutputCache指令中的Duration為"999999"用來表示無限,再加入一個屬性SqlDependency,設定該屬的值為"database,tableName"。其中database為Web.config 中 <add> 元素的name 屬性中指定的資料庫名。以Northwind的products表為例就應該寫作:SqlDependency="Northwind:products"。如果有兩張表就寫作:database:tableName;database2:tableName2。

      如果一切配置結束,就可以看效果了。你會發現只有當資料被更新的時候,才會更新緩衝。這個效果顯然比前面幾種方式來得更好,但是也不能過渡的使用這種方式,畢竟輪詢還是會負出一些代價的。
      [注,上述配置過程中所涉及到的一些資料庫名稱、表名稱,大小寫一定要前後一致,否則可能會編譯失敗。]

      樣本打包下載 

      參考:
      1.蘇鵬老師講的“asp.net2.0緩衝與效能”
      2.vs2005入門 之 Substitution [視頻]
      3.Asp.net 緩衝技術總結
      4.將 ASP.NET 輸出緩衝與 SQL Server 結合使用
      5.使用 SQL 緩衝依賴項

作者:stg609
出處:http://stg609.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.