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