1. 程式人生 > >深入System.Web.Caching名稱空間 教你Hold住快取管理(三)

深入System.Web.Caching名稱空間 教你Hold住快取管理(三)

本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會:

在學習了前兩篇Cache類和CacheDependency類的用法後,最後一篇,我們來玩一下SqlCacheDependency類實現資料庫快取的及時更新。

如果對快取管理沒有基礎的看官,建議看完前兩篇再來看這一篇。

 

一,資料庫快取依賴類SqlCacheDependency

  SqlCacheDependency類的使用需要結合SQL Server資料庫,目前還沒有Oracle資料庫的快取依賴。此篇我們使用SQL Server2005來演示。

  1.語法定義

  SqlCacheDependency類的語法定義如下:

public class SqlCacheDependency: IDisposable

 

  同CacheDependency類一樣,SqlCacheDependency也繼承了介面”IDisposable“,此介面主要用來定義釋放分配的非託管資源的方法。

  繼承此介面的類,必須實現方法Dispone ,實現資源的釋放。這個介面在第二篇中有稍作介紹,在此不再複述了。

  SqlCacheDependency的主要建構函式如下:

public SqlCacheDependency(string dataBase,string table)

  dataBase代表要啟用的快取的資料庫,table代表快取的表。實際使用過程中,只需要指明快取的資料和表就可以了。

  2.方法和屬性

  SqlCacheDependency類的方法和屬性與CacheDependency類相同,主要還是那三個:

  • 屬性”HasChanged“:判斷資料庫依賴是否發生了變化。
  • 屬性”UtcLastModified“:獲取資料庫快取依賴項上次更改的事件。
  • 方法”Dispose“:釋放SqlCacheDependency物件佔用的資源。

  這三個成員的使用方法同CacheDependency類的成員相似,所以在此不再贅述。有需要的話可以在參考第二篇。

 

二,使用SqlCacheDependency類的流程

  實現資料庫快取依賴,我所知的方法有兩種,一種是使用程式設計的方法來實現,與第二篇中的實現檔案快取依賴的思路相似,不過建立快取時依賴項是SqlCacheDependency的一個例項。

  所以這裡我想介紹給大家的是OutputCache快取技術。如果想使用程式設計方式來實現此功能,可參考第二篇中最後的示例。

  要實現資料庫快取依賴,必須結合資料庫的操作。在使用資料庫快取依賴之前,必須進行5步操作:

  

 

  只有具備了上述條件,才可以正常的使用資料庫快取依賴。最後我們看看如何來實現。

 

三,典型應用:使用SqlCacheDependency獲取資料庫表最新資料

 

  這個示例所體現的功能是,快取資料庫表,並在內容發生變化時,儲存在快取中的資料項更新到最新。

 

  1,建立資料庫併為

  我們首先建立一個數據庫JohnConnor_DB,然後在資料庫中新增一個Player表:

  • id <int> 自增長資料標識,
  • Name <nvarchar(20)>  球員姓名,
  • Height<nvarchar(10)> 球員身高

 

  2,通知資料庫啟用快取依賴項

  SQLServer支援SqlCacheDependency特性,需要對資料庫伺服器執行相關的配置。

  現在我們來為資料庫啟用快取通知。這裡有兩種方式來通知資料庫,表啟用快取依賴項,

  • 借用ASPNET_REGSQL命令列工具
  • 使用SqlCacheDependencyAdmin類

   首先我們來介紹使用命令列工具,該工具位於windows\microsoft.net\framework\[版本]資料夾中。如果你找不到它,在安裝VS2005以上版本的前提下,

  可以點選 開始/所有程式/MicroSoft Visual Studio 2010/Visual Studio Tools/Visual Studio 2010命令提示來使用它,在命令提示框中輸入

aspnet_regsql.exe -S 192.168.1.99\sqlserver2005 -U (JohnConnor),-P (JohnConnorV5) -ed -d JohnConnor_DB -et -t Player

 

  注意如果使用的資料庫驗證方式是"Sql Server身份驗證",則需要-E換成,

  如果你想了解上面每個命令引數的意義,可以輸入aspnet_regsql.exe -? 這裡為了方便大家理解給了個引數列表(列表是COPY來的,原諒我的懶惰,阿門~~~)

  • -S 後接的引數為資料庫伺服器的名稱或者IP地址;
  • -U 後接的引數為資料庫的登陸使用者名稱;
  • -P 後接的引數為資料庫的登陸密碼;
  • -E 使用當前登入使用者的 Windows 整合認證進行身份驗證。
  • -d 後接引數為對哪一個資料庫採用SqlCacheDependency功能;
  • -C 連線資料庫的連線字串。如果您指定伺服器(-S)和登入(-U和-P,或 -E)資訊,則此選項不是必需的,因為連線字串已經包含這些資訊。
  • -t 後接引數為對哪一個表採用SqlCacheDependency功能;
  • -ed 允許對資料庫使用SqlCacheDependency功能;
  • -dd 禁止對資料庫採用SqlCacheDependency功能;
  • -et 允許對資料表採用SqlCacheDependency功能;
  • -dt 禁止對資料表採用SqlCacheDependency功能;
  • -lt 列出當前資料庫中有哪些表已經採用sqlcachedependency功能。

 

  輸入命令後,回車,執行成功,會提示為SQL快取依賴項啟用該資料庫/表。

  第二個方法使用SqlCacheDependencyAdmin類,直接在頁面的“Page_Load”下加入以下注冊程式碼

複製程式碼
  protected void Page_Load(object sender, EventArgs e)
    {   
     System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(
  System.Configuration.ConfigurationManager.ConnectionStrings["name"].ConnectionString);//通知哪個資料庫,name是該資料庫連結字串的名字 System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(
  System.Configuration.ConfigurationManager.ConnectionStrings["name"].ConnectionString, "Player");//通知啟用哪個表,Player是表名 }
複製程式碼

 

  就可以了。

  兩種方法執行後,會向資料庫裡新增一個AspNet_SqlCacheTablesForChangeNotification表。

 

 

  3,在網站中進行資料庫快取項配置

  然後我們新建一個ASP.NET網站(我偷懶,第二篇的改個名字繼續用...),命名為JohnConnor.SqlCacheDependencySample。

  首先我們在Web.Config中配置資料庫連結字串:

 <connectionStrings>
        <add name="TestDBconnectionStrings" providerName="System.Data.SqlClient" 
      connectionString="Data Source=192.168.1.99\SQLSERVER2005;Initial Catalog=JohnConnor_DB;User ID=JohnConnor;Password=JohnConnorV5;" /> </connectionStrings>

 

  然後在“system.web”節點內,新增資料庫快取依賴的配置,注意配置中的“connectionStringsName”屬性,需要與前面建立的資料庫連結字串名字對應:

複製程式碼
  <caching>
       <sqlCacheDependency enabled="true" pollTime="1000">
           <databases>
               <add name="JohnConnor_DB" connectionStringName="TestDBconnectionStrings" pollTime="1000"/>  
                </databases>
       </sqlCacheDependency>
   </caching>
複製程式碼

  現在我們的配置部份就暫時告一段落。下面我們來驗收成果。

 

  4. 完成示例

  我們在預設生成的Default.aspx頁,新增一個GridView控制元件,用來顯示從資料庫獲取的資料。並新增一個控制元件,主要用來顯示時間,用時間來判斷頁面顯示的是否是快取資料。

  首先給GridView配置資料來源,單擊任務列表,在“選擇資料來源”下拉框中,單擊“新建資料來源”,在配置嚮導的資料來源型別視窗中選擇“資料庫”,單擊“確定”後出現選擇連結字串視窗,在下拉列表中選擇我們剛才建立的”TestDBconnectionStrings“連線串,單擊”下一步“,出現“配置Select語句”對話方塊,在“列”列表框中選擇“*”,表示選中所有列,”下一步“,“完成”。

  現在切換到程式碼檢視,在"Page_Load"事件中新增:

Literal.Test=DateTime.Now.ToString();

  主要是來判斷顯示的是不是快取。現在儲存下F5,重新整理頁面可以看到時間是不斷變化的,說明資料並非來自快取。

  現在在Default.aspx的原始碼檢視的"<@page>"行下,新增如下程式碼:

<%@ OutputCache Duration="3600"  SqlDependency="JohnConnor_DB:Player" VaryByParam="none"%>

  這樣資料庫快取依賴就新增完成了。

  現在F5執行網站,此時再重新整理頁面,發現時間已經不再變化,因為整個頁的資料都被快取了。

  現在我們修改以下資料庫的內容,然後重新整理剛才的頁面,可以發現,時間向後推進了,資料也發生了改變。

  這就是資料庫快取依賴的作用了。

  當資料庫內容更新的時候,不管快取的時間是否到了,快取內容都會被更新。

  ----------------------------------------------------------END------------------------------------------------------

  草草結了個尾。。。

  至此,三篇已經完結。這是一個完結的短篇幅系列,,,不容易呢。比較忙丫,沒時間寫長篇。

  謝謝大家捧場。希望能夠幫助到有用的人