本文分三篇,從緩存所在命名空間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------------------------------------------------------
草草結了個尾。。。
至此,三篇已經完結。這是一個完結的短篇幅系列,,,不容易呢。比較忙丫,沒時間寫長篇。
謝謝大家捧場。希望能夠幫助到有用的人。