天天看點

資料庫緩存依賴詳解

 緩存命名空間的講解流程

16.1  System.Web.Caching簡介 本節從緩存命名空間的總體簡介群組成結構入手,從整體上對System.Web.Caching進行概述。 16.1.1  System.Web.Caching概述 System.Web.Caching 是用來管理緩存的命名空間。緩存就是将伺服器端的資料暫時儲存在用戶端,友善使用者的讀取。緩存命名空間的父級空間是“System.Web”,由此可以看 出,緩存通常用于Web網站的開發,包括在B/S項目中的開發。緩存的設計主要是考慮到網絡帶寬可能會延緩資料的送出和回發,如果将資料儲存在用戶端,用 戶可以直接從用戶端讀取資料,這樣資料就是從本地提取的,不會再受網絡的影響。 System.Web.Caching命名空間提供與緩存有關的所有操作類,具體包括哪些類将在下一節詳細介紹。 16.1.2  System.Web.Caching命名空間内的類組成 緩存命名空間主要提供三種操作:緩存資料對象、對象的緩存依賴和資料庫的緩存依賴。其中緩存任何對象都使用一個類Cache,但當緩存發生改變時,普通對象和資料庫對象的依賴處理不同。 圖16-2羅列的是在三層結構中緩存的部署情況。兩個依賴類CacheDependency和SqlCache Dependency主要更改發生變化的緩存資料,起到通知的作用。當資料沒有被緩存時,使用Cache類進行添加。 下面根據圖16-2的部署,來介紹圖中使用的緩存類。這些類的說明如表16-1所示。 圖16-2  三層結構中緩存的部署圖 表16-1  緩存命名空間中的類及其說明

類    名 說    明
Cache 對緩存對象的編輯類,其操作包括緩存的增、删、改
CacheDependency 基本緩存對象的依賴,當基本對象發生變化時,更新緩存内容
SqlCacheDependency 資料庫緩存對象的依賴,當資料庫中的資料變化時,更新緩存内容

16.2  管理緩存的類:Cache類 Cache類用來存儲資料對象,并提供方法對這些對象進行編輯。本節主要介紹Cache類包含的方法,以及如何使用這些方法實作資料對象的緩存。 16.2.1  功能說明 Cache類屬于字典類,其根據一定的規則存儲使用者需要的資料,這些資料的類型不受限制,可以是字元串、數組、資料表、Dataset和哈希表等。 使用Cache類的優點是當緩存的資料發生變化時,Cache類會讓資料失效,并實作緩存資料的重新添加,然後通知應用程式,報告緩存的及時更新。 16.2.2  文法定義 Cache類的文法定義如下: public sealed class Cache : IEnumerable 通過其定義可以發現,Cache類是“sealed”定義的類,表示此類被密封,不能被繼承。同時Cache類還繼承了IEnumerable接口,表示允許對集合中的資料進行枚舉操作。 緩存的生命周期随着應用程式域的活動結束而終止,也就是說隻要應用程式域依然處于活動狀态,緩存就會一直保持,因為每個應用程式域都會建立一個緩存執行個體。此執行個體的資訊通過HttpContext對象的Cache屬性或Page對象的Cache屬性擷取。 下面的代碼示範如何将數組資料添加到緩存中: ArrayList myarray = new ArrayList();        //建立數組資料 myarray.Add("1.學習園地"); myarray.Add("2.交流論壇"); myarray.Add("3.幫助"); Cache.Add("Category", myarray);        //将數組添加到緩存中 16.2.3  方法詳解 Cache類的方法主要提供對緩存資料的編輯操作,如增、删、改等。其中最常用的方法及其說明如表16-2所示。 表16-2  Cache類的主要方法及其說明

名    稱 說    明
Add 将資料添加到Cache對象
Insert 向Cache中插入資料項,可用于修改已經存在的資料緩存項
Remove 移除Cache對象中的緩存資料項
Get 從Cache對象中擷取指定的資料項,注意傳回的是Object類型,需要進行類型轉換
GetType 從Cache對象中擷取資料項的類型,判斷資料類型後,友善進行轉換
GetEnumerator 循環通路Cache對象中的緩存資料項。注意其傳回類型是“IDictionaryEnumerator”

技巧:要想修改緩存資料,隻需要重新為緩存指派即可。 最需要注意的是Add方法,其使用文法如下: public Object Add (      string key,      Object value,      CacheDependency dependencies,      DateTime absoluteExpiration,      TimeSpan slidingExpiration,      CacheItemPriority priority,      CacheItemRemovedCallback onRemoveCallback ) 在使用Add方法時,以上7個參數是必需的,其代表意義如下: — 參數“key”代表緩存資料項的鍵值,必須是唯一的。 — 參數“value”代表緩存資料的内容,可以是任意類型。 — 參數“dependencies”表示緩存的依賴項,也就是此項的更改意味着緩存内容已經過期。如果沒有依賴項,可将此值設定為NULL。 — 參數“absoluteExpiration”是日期型資料,表示緩存過期的時間,.NET 2.0提供的緩存在過期後是可以使用的,能使用多長時間,就看這個參數的設定。 — 參數“slidingExpiration”的類型表示一段時間間隔,表示緩存參數将在多長時間以後被删除,此參數與absoluteExpiration參數相關聯。 — 參數“priority”表示撤銷緩存的優先值,此參數的值取自枚舉變量“CacheItemPriority”,優先級低的資料項将先被删除。此參數主要用在緩存退出對象時。 — 參數“onRemoveCallback”表示緩存删除資料對象時調用的事件,一般用做通知程式。 下 面的代碼示範了如何應用Cache類的這些方法。在使用本代碼時需要注意,代碼中使用了Arraylist對象,是以需要添加對命名空間 “System.Collections”的引用,同時使用Cache類别忘記了添加命名空間“System.Web.Caching”。     protected void Page_Load(object sender, EventArgs e)     {         ArrayList myarray = new ArrayList();         //建立數組資料         myarray.Add("1.學習園地");         myarray.Add("2.交流論壇");         myarray.Add("3.幫助");         //将數組添加到緩存中——使用Add方法         Cache.Add("Category", myarray, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.Normal, null);         myarray[1] = "2.交流園地";                     //修改數組資料           Cache.Insert("Category", myarray);           //使用Insert方法修改緩存資料         string tmpStr = "這是一個臨時資料";         Cache["tmpdata"] = tmpStr;         //使用Get方法擷取緩存資料         Response.Write(Cache.Get("tmpdata").ToString()+"<br/>");/         Cache["tmpdata"] = "這是一個臨時字元串";         //重新為緩存指派的技巧         Response.Write(Cache.Get("tmpdata").ToString() + "<br/>");         //使用GetType方法判斷緩存資料的類型         if (Cache["Category"].GetType().Name == "ArrayList")             Response.Write("類型是數組");         //使用GetEnumerator方法周遊緩存中的資料         IDictionaryEnumerator mycache = Cache.GetEnumerator();         while (mycache.MoveNext())             Response.Write(mycache.Value + "<br/>");         Cache.Remove("tmpdata");//使用Remove方法移除緩存的臨時資料 } 技巧:在使用GetType方法時,如果要判斷類型,需要使用Object.GetType().Name屬性擷取類型的名稱。 上述代碼的運作結果如下: 這是一個臨時資料 這是一個臨時字元串 類型是數組這是一個臨時字元串 System.Collections.ArrayList 其中在讀取類型為ArrayList的資料時,由于沒有進行類型轉換,是以取出的是類型為“System.Collections.ArrayList”的對象。本書會在本節最後的執行個體中介紹如何讀取數組的詳細内容。 16.2.4  屬性詳解 Cache類的屬性主要用來擷取緩存資料的一些基本資訊,如緩存的項總數、指定位置的緩存項等。本書主要介紹兩個屬性:Count和Item。 Count用來擷取緩存中所有的項的總數。使用方法如下: Response.Write(Cache.Count); Item用于傳回指定項的内容,一般繼承“IEnumerable”接口的類都有這樣的屬性,注意項需要使用“[ ]”包裝。其使用方法如下: Response.Write(Cache[“Category”].ToString()); 16.2.5  典型應用:實作資料的緩存快速讀取功能 Cache主要用來緩存使用頻率高且不需經常更新的資料。本例實作一個目錄清單的緩存。為了簡便,清單的内容并沒有從資料庫中讀取,而是儲存在一個ArrayList對象中。 本例的目的是将目錄清單填充到下拉框中,當緩存失效後,目錄清單的内容為空。示範的步驟如下所述。

資料庫緩存依賴詳解

     在VS2005中建立一個網站,命名為“CacheSample”。

資料庫緩存依賴詳解

     打開預設生成的Default.aspx頁,在其中添加一個下拉清單框和一個按鈕。

資料庫緩存依賴詳解

     按F7鍵切換到頁面的代碼視圖。不要忘記對命名空間的引用,代碼如下: using System.Web.Caching; using System.Collections;

資料庫緩存依賴詳解

     在“Page_Load”事件中判斷是否存在目錄緩存,如果沒有,則将目錄添加到緩存中。詳細代碼如下所示,其中目錄清單的儲存時間是5秒。 protected void Page_Load(object sender, EventArgs e) {     if (!Page.IsPostBack)     {        ArrayList myarray = new ArrayList();//假設ArrayList的内容來自資料庫         myarray.Add("古代曆史");         myarray.Add("當代文學");         myarray.Add("流行小說");         myarray.Add("武俠小說");         if (Cache["Categorys"] == null)  //判斷是否存在緩存         {             //如果緩存不存在,則添加——儲存時間是5秒             Cache.Add("Categorys", myarray, null, DateTime.Now.AddSeconds(5),                 TimeSpan.Zero, CacheItemPriority.Normal, null);         }     } }

資料庫緩存依賴詳解

   回到設計視圖,輕按兩下按鈕控件,切換到按鈕的事件代碼中。

資料庫緩存依賴詳解

     在按鈕的輕按兩下事件中,需要判斷是否有目錄的緩存,有則在下拉框中顯示目錄内容,沒有則清空下拉框。詳細代碼如下: protected void Button1_Click(object sender, EventArgs e) {     if (Cache["Categorys"] != null)        //判斷緩存是否失效     {         //如果沒有失效,則取出緩存的清單,注意類型的轉換。         DropDownList1.DataSource = (ArrayList)Cache["Categorys"];         DropDownList1.DataBind();     }     else     {         DropDownList1.Items.Clear();   //如果已經失效,則清空清單     } }

資料庫緩存依賴詳解

     按Ctrl+S組合鍵儲存所有的代碼,再按F5鍵運作程式。在5秒以内如果單擊按鈕,則正常顯示目錄清單,如果超過5秒,則緩存對象已經不存在,是以下拉清單框的内容為空。 本節主要介紹了Cache類的使用方法,其中并沒有涉及緩存依賴内容,即當實際資料改變時,緩存是否随着改變。下一節将通過學習“CacheDependency”類了解緩存依賴的詳細實作。 16.3  緩存依賴類:CacheDependency類 CacheDependency類是架設在Cache類和實際資料之間的橋梁。本節将詳細介紹如何利用CacheDependency類實作資料緩存的及時更新。 16.3.1  功能說明 CacheDependency 類被稱為是緩存依賴類,其具體意義表現在當緩存對象的實際資料發生改變時,它能及時通知緩存對象。例如緩存對象“Category”儲存的是一個XML文 件的資料,如果XML檔案發生了變化,那麼系統通過CacheDependency類就會及時更新緩存對象“Category”的内容,這樣就能保證使用者 讀取的永遠是最新的資料。 16.3.2  文法定義 CacheDependency類的文法定義如下: public class CacheDependency : IDisposable 其中繼承了接口“IDisposable”,此接口主要用來定義釋放配置設定的非托管資源的方法。繼承此接口必須實作方法Dispose,以實作資源的釋放。 CacheDependency類的構造函數實作了8個重載,下面的代碼列出了這些重載的函數,并詳細說明了各函數的參數。了解這些函數就可以知道CacheDependency究竟能為緩存帶來什麼優勢。     //假設緩存的來源檔案是目前目錄下的data.xml檔案     //緩存依賴的檔案路徑     CacheDependency mydep = new CacheDependency("data.xml");     //緩存依賴的檔案可以有多個     CacheDependency mydep1=new CacheDependency(new string []{"data.xml","data1.xml"});     //檢查緩存依賴更改的依據時間     CacheDependency mydep2 = new CacheDependency("data.xml", DateTime.Now);     //檢查多個依賴檔案更改的依據時間     CacheDependency mydep3 = new CacheDependency(new string[] { "data.xml", "data1.xml" }, DateTime.Now);     //檢查依賴多個檔案,也依賴多個緩存鍵值     CacheDependency mydep4 = new CacheDependency(new string[] { "data.xml", "data1.xml" },         new string[] { "Category", "Category1" });     //關聯依賴,還可以依賴于另一個檔案緩存依賴     CacheDependency mydep5 = new CacheDependency(new string[] { "data.xml", "data1.xml" },         new string[] { "Category", "Category1" }, mydep);     //檔案和鍵值上次修改的依據時間     CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" },         new string[] { "Category", "Category1" }, DateTime.Now);     //檔案、另一個緩存依賴和鍵值上次修改的依據時間     CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" }, new string[] { "Category", "Category1" }, mydep,DateTime.Now); 16.3.3  方法和屬性 雖然CacheDependency類完成了很重要的功能,但其組成結構卻比較簡單,主要有兩個屬性和一個方法。 — 屬性“HasChanged”:判斷CacheDependency對象是否已更改。 — 屬性“UtcLastModified”:傳回上次依賴項的修改日期 — 方法“Dispose”:釋放CacheDependency對象所占有的資源。因為緩存類繼承了接口“IDispose”,是以必須實作此方法。 由于緩存類的構成比較簡單,本節并沒有給出示範代碼,屬性和方法的使用将在下一節的執行個體中示範。 注意:隻有Cache類的Insert和Add方法才可以為緩存添加依賴項。 16.3.4  典型應用:用CacheDependency擷取最新的資料 本例主要示範如何使用CacheDependency類實作資料的及時更新。執行個體中使用一個GridView控件顯示XML檔案的資料,當XML檔案的資料發生改變時,用戶端可以及時更新。其實作的功能如圖16-3所示。 圖16-3  用CacheDependency擷取最新資料的功能實作圖 示範的詳細步驟如下所述。

資料庫緩存依賴詳解

     打開VS2005,建立一個網站,命名為“CacheDependencySample”。

資料庫緩存依賴詳解

     在網站根目錄下,添加一個XML檔案,用來為控件提供資料,内容如下: <?xml version="1.0" encoding="utf-8" ?> <book>      <bookinfo>          <name>英國古代</name>          <price>28.00</price>      </bookinfo>      <bookinfo>          <name>中國曆史</name>          <price>20.00</price>      </bookinfo> </book>

資料庫緩存依賴詳解

     打開預設生成的Default.aspx頁,添加一個GridView控件和一個按鈕控件。

資料庫緩存依賴詳解

     按F7鍵切換到窗體的代碼視圖,在Page_Load事件中書寫生成緩存的代碼。詳細内容如下: private static CacheDependency mydepen; protected void Page_Load(object sender, EventArgs e) {     if (!IsPostBack)     {         //建立XML資料源         DataSet myds = new DataSet();         //資料源來自檔案data.xml         myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));         //判斷是否存在緩存         if (Cache["BOOKS"] == null)         {             //建立緩存依賴            mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath                 + @"/data.xml"));             //添加緩存項             Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,                 CacheItemPriority.Normal, null);         }     } } 注意:使用XML檔案讀取方法,必須添加XML操作方法所在的命名空間“System.Xml”。

資料庫緩存依賴詳解

     切換回設計視圖,再輕按兩下按鈕控件,此時光标停靠在按鈕的Click事件内。在此事件内書寫代碼,判斷XML檔案的資料是否已更新,如果已更新則給出提示,并重新添加緩存依賴項,否則直接從緩存讀取GridView控件的資料。

資料庫緩存依賴詳解

     在“Button1_Click”事件内書寫的詳細代碼如下: protected void Button1_Click(object sender, EventArgs e) {     //判斷緩存是否發生了變化     if (mydepen.HasChanged)     {         Response.Write("Sorry,資料發生了變化!上次修改時間是:" + mydepen.UtcLastModified);     }     //判斷緩存項是否還在     if (Cache["BOOKS"] == null)         {         //重新設定緩存項             DataSet myds = new DataSet();             myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));             mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/ data.xml"));         Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero, CacheItemPriority.Normal, null);         }         GridView1.DataSource = Cache["BOOKS"];         GridView1.DataBind(); } 注意:當XML檔案發生改變後,其實緩存依賴和緩存項都被移除了,必須重新定義。

資料庫緩存依賴詳解

     按Ctrl+S組合鍵儲存代碼的修改。再按F5鍵運作程式,單擊“擷取資料”按鈕,GridView就會顯示XML檔案的内容。

資料庫緩存依賴詳解

     程式運作正常後,在背景修改XML檔案的内容,然後再單擊“擷取資料”按鈕,則出現更改資料的提示,同時GridView顯示了新的内容。圖16-4和圖16-5是資料更改前和更改後的效果對比。

資料庫緩存依賴詳解
資料庫緩存依賴詳解

圖16-4  初次擷取的資料效果圖                 圖16-5  更改資料後的顯示效果圖 16.4  資料庫緩存依賴類:SqlCacheDependency類 資料庫緩存依賴主要解決的是當資料庫的内容發生改變時,如何及時通知緩存,并更新緩存中的資料的問題。本節就介紹如何使用SQL Server 2005和.NET 2.0實作資料庫的緩存依賴。 16.4.1  功能說明 SqlCacheDependency類的使用需要結合SQL Server 2005資料庫,目前還沒有Oracle資料庫的緩存依賴。 16.4.2  文法定義 SqlCacheDependency類的使用文法如下: public class SqlCacheDependency : IDisposable 其中繼承了接口“IDisposable”,此接口主要用來定義釋放配置設定的非托管資源的方法。繼承此接口必須實作方法Dispose,用來實作資源的釋放。 SqlCacheDependency類主要的構造函數如下: public SqlCacheDependency(string database,string table) 其中參數一代表要啟用緩存的資料庫,參數二表示緩存的表。在實際使用過程中,隻需要指明緩存的資料庫和表即可。 16.4.3  方法和屬性 SqlCacheDependency類的方法和屬性同CacheDependency類相同,主要有三個。 —  HasChanged:判斷資料庫緩存依賴是否發生了變化。 —   UtcLastModified :擷取緩存依賴上次更改的時間。 —  Dispose:釋放緩存依賴所占用的資源。 這三個成員的使用方法同CacheDependency類的成員相似,本節不再贅述。 在 下節要介紹的使用執行個體中,将不再使用代碼的方式實作緩存依賴,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency參數實作資料庫表的緩存。如果要使用程式設計的方式實作此功能,可參考CacheDependency類 的執行個體。 16.4.4  使用SqlCacheDependency類的操作流程 要實作資料庫緩存依賴,必須結合資料庫的操作。在使用資料庫緩存依賴前,必須進行5步操作。詳細流程如圖16-6所示。 隻有具備了上述條件,才可以正常地使用資料庫緩存依賴。下一節将結合這5步操作示範如何實作資料庫的緩存依賴。

建立資料庫連結

圖16-6  使用資料庫緩存依賴的流程 16.4.5  典型應用:擷取資料庫表最新資料的執行個體 本例要實作的功能是當資料庫的内容發生變化時,儲存在緩存中的資料項被更新。具體示範的步驟如下所述。

資料庫緩存依賴詳解

     在資料庫中建立資料庫“testCache”。

資料庫緩存依賴詳解

     在資料庫“testCache”中添加表“CacheTable”,其資訊如表16-3所示。 表16-3  CacheTable表的資訊

字  段  名 字段類型 說    明
id int 自增長資料辨別
Name nvarchar(20) 書名
bookPublish nvarchar(50) 出版社
Price decimal(6,2) 書的價格
資料庫緩存依賴詳解

     為資料庫啟用緩存通知。打開“開始”|“所有程式”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”菜單指令。

資料庫緩存依賴詳解

     輸入如下指令,其中“-ed”和“-et”分别代表啟用緩存依賴資料庫和啟用緩存資料表。 aspnet_regsql.exe -S  CGJ-57F90CCA64C/SQLEXPRESS -E -ed -d  testCache -et -t  CacheTable 注意如果使用的資料庫驗證方式是“SQL Server身份驗證”,則需要使用如下的啟動指令: aspnet_regsql.exe -S  CGJ-57F90CCA64C/SQLEXPRESS  -U <Username> -P <Password> -ed -d testCache -et -t CacheTable

資料庫緩存依賴詳解

   輸入指令後,按Enter鍵。如果執行成功,效果如圖16-7所示。

資料庫緩存依賴詳解

     打開VS2005,建立一個網站,命名為“SqlCacheDependency”。

資料庫緩存依賴詳解

     按F5鍵運作程式,主要目的是生成一個預設的Web.Config檔案。然後關閉運作的程式。

資料庫緩存依賴詳解

     在Web.config中配置資料庫連接配接字元串,代碼如下:      <connectionStrings>          <add name="TestCacheConnectionString" connectionString="Data Source=CGJ-57F90 CCA64C/sqlexpress;Initial Catalog=testCache;Integrated Security=True" providerName= "System. Data.SqlClient"/>      </connectionStrings>

資料庫緩存依賴詳解

圖16-7  啟用資料庫緩存依賴成功的提示圖

資料庫緩存依賴詳解

     在“system.web”節點内,添加資料庫緩存依賴的配置,詳細代碼如下所示。注意配置中的“connectionStringName”屬性,要與前面建立的資料庫連接配接字元串的名字相對應。 <caching>      <sqlCacheDependency enabled = "true" pollTime = "1000" >          <databases>               <add name="testCache"                  connectionStringName="TestCacheConnectionString"                  pollTime = "1000"      />          </databases>      </sqlCacheDependency> </caching>

資料庫緩存依賴詳解

     按Ctrl+S組合鍵儲存配置檔案的更改。

資料庫緩存依賴詳解

     打開預設生成的Default.aspx頁,在設計視圖中添加一個GridView控件,用來顯示從資料庫擷取的資料。再添加一個Literal控件,主要用來顯示時間,通過時間判斷顯示的是否是緩存中的資料。

資料庫緩存依賴詳解

     為GridView配置資料源。單擊其任務清單,在“選擇資料源”下拉框中,單擊“建立資料源”指令,打開資料源的配置向導。

資料庫緩存依賴詳解

     在打開的資料源類型視窗中,選擇“資料庫”,單擊“确定”按鈕,出現選擇連接配接字元串視窗,通過下拉清單選擇剛剛建立的“TestCacheConnectionString”連接配接串。

資料庫緩存依賴詳解

     單擊“下一步”按鈕,出現“配置Select語句”對話框,在“列”清單框中選擇“*”,表示選中所有列。

資料庫緩存依賴詳解

     單擊“下一步”按鈕出現測試查詢對話框,然後單擊“完成”按鈕。

資料庫緩存依賴詳解

     按F7鍵切換到到代碼視圖,在“Page_Load”事件中添加如下代碼(主要是顯示目前的時間,用來判斷是否是緩存資料): Literal1.Text = DateTime.Now.ToString();

資料庫緩存依賴詳解

     按Ctrl+S組合鍵儲存目前頁的設計,再按F5鍵運作程式。當重新整理頁面時,可以看到時間是不斷變化的,這說明資料并沒有來自緩存。

資料庫緩存依賴詳解

     打開Default.aspx頁,在源代碼視圖的“<@page ”行下面,添加如下所示代碼。其中使用的參數“SqlDependency”,就是用來添加資料庫緩存依賴的。  <%@ OutputCache Duration="3600" SqlDependency="testCache:CacheTable" VaryByParam="none" %> 注意:Duration參數是表示緩存的過期時間,機關是毫秒。

資料庫緩存依賴詳解

     按F5鍵運作程式,此時再重新整理頁面,發現目前的時間已經不再變化,因為整個頁的資料被緩存了起來。

資料庫緩存依賴詳解

     此時修改資料庫的内容,然後重新整理運作着的頁面,可以發現,資料跟着發生了變化。這就是資料庫緩存依賴的展現。當資料庫内容更新時,不管緩存的時間有沒有到,緩存的内容都會被更新。 16.5  Session和Cache的差別 以前實作資料的緩存 有很多種方法,有用戶端的Cookie,有伺服器端的Session和Application。其中Cookie是儲存在用戶端的一組資料,主要用來儲存 使用者名等個人資訊。Session則儲存對話資訊。Application則是儲存在整個應用程式範圍内的資訊,相當于全局變量。通常使用最頻繁的是 Session,那麼Session和Cache又有什麼差別呢? 本節結合使用經驗,詳細介紹Session緩存和Cache緩存的差別。 (1)最大的差別是Cache提供緩存依賴來更新資料,而Session隻能依靠定義的緩存時間來判斷緩存資料是否有效。 (2)即使應用程式終止,隻要Cache.Add方法中定義的緩存時間未過期,下次開啟應用程式時,緩存的資料依然存在。而Session緩存隻是存在于一次會話中,會話結束後,資料也就失效了。 (3)Session容易丢失,導緻資料的不确定性,而Cache不會出現這種情況。 (4)由于Session是每次會話就被加載,是以不适宜存放大量資訊,否則會導緻伺服器的性能降低。而Cache則主要用來儲存大容量資訊,如資料庫中的多個表。 (5)VS2005的測試版提供了将緩存儲存在硬碟上的參數,但正式版中取消了這個功能,估計其在以後版本中會重新實作。而Session目前隻能儲存在記憶體中,對其性能有影響。 為了提高Cache的有效使用率,建議對于不經常改動的資料使用Cache。 16.6  小結 本章主要介紹了如何 使用System.Web.Caching命名空間下的類,主要包括以下三個:Cache, CacheDependency和SqlCacheDependency。Cache類主要用來建立緩存項,主要針對的是資料不經常改變,但又使用頻繁的 資料表或檔案。另兩個類是.NET 2.0新添加的緩存依賴服務。通過檔案依賴或資料庫依賴,可以實作緩存資料的及時更新。 通過本章的學習,希望可以提高讀者編寫的網站的資料讀取速度,節約帶寬,為Web 2.0時代的到來打下堅實的基礎。