深入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------------------------------------------------------

  草草結了個尾。。。

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

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

  

 

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM