在.NET1.1下面Cache只能基於檔案系統、物件等做Cache的依賴項,但是在.NET 2.0提供了一個新的依賴項SqlCacheDependency,這個項目使我們Cache依賴資料庫的變化來改變。雖然這做法看起來和1.1裡面的變通做法相似,但是它們之間還是有本質的區別(SqlCacheDependency物件的提供)。 (1.1的變通做法是為數據表創建觸發器,然後該觸發器在觸發的時候會修改一個本地文件,系統中的某一個Cache的依賴項就是這個本地的文件,這樣來通知Cache所緩存的數據變化了)
.NET 2.0的SqlCacheDependency可以在SqlServer2000以後的版本使用,本文介紹在Sql Server 2000下的使用方法,Sql Server 2005的稍有不同。
首先要安裝.NET 2.0的框架,當然Sql Server 2000一定要有了。在.NET 2.0裡微軟提供了一個實用工具:aspnet_regsql(和aspnet_regiis在同一個目錄下面),這是一個命令列工具,該命令列參數可以透過aspnet_regsql -?取得。這裡我們關心下面幾個參數:-ed為SQL快取依賴項啟動資料庫,-E使用目前的windows憑證進行驗證,-d用於應用伺服器的資料庫名稱,如果未指定任何資料庫名稱,則使用預設資料庫“aspnetdb”。本文中將使用微軟的範例資料庫pubs。那我們就要使用下面的命令列來建立快取依賴資料庫:
aspnet_regsql -ed -E -d pubs
(注意:這裡的命令列參數是去分大小寫的)
當執行完這個命令後,我們可以打開pubs資料庫看看發生了什麼變化,首先多了一個表:AspNet_SqlCacheTablesForChangeNotification,這個表裡面有3個字段, tableName:監視的表格名稱,notificationCreated:建立時間。 changeId:變更編號(累加欄位)。還可以看到資料庫多了幾個預存程序,他們分別是:
AspNet_SqlCacheRegisterTableStoredProcedure,
AspNet_SqlCacheUnRegisterTableStoredProcedure,
AspNet_SqlCacheUpdateChangeIdStoredProcedure,
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,
AspNet_SqlCachePollingStoredProcedure
從字面上這幾個預存程序都很好理解,該預存程序的詳細內容可以在查詢分析器裡面打開後查看。為了可以監視一個表的變化,我們需要透過執行AspNet_SqlCacheRegisterTableStoredProcedure預存程序來指定一個需要監視的表,當然也可以透過實用工具aspnet_regsql來指定,命令列如下:
aspnet_regsql -et -E -d pubs -t authors
執行上面的指令以後,aspnet_regsql會為authors建立一個觸發器,以下是我執行該指令後所建立的觸發器:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [authors]
FOR INSERT, UPDATE, DELETE AS BEGIN
SET NOCOUNT ON
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
從觸發器可以看出,當對authors表插入,刪除以及更新的時候都會執行預存程序AspNet_SqlCacheUpdateChangeIdStoredProcedure,該預存程序會在AspNet_SqlCacheTablesForChangeNotification表裡面新增一筆記錄。記錄如下:
tableName notificationCreated changeId
authors 2006-06-20 09:38:26.267 1
當你對authors裡面的資料做任何修改changeId都會累加,其他欄位不變更。
接著要在web.config裡面加入一些內容就可以使用了。
首先新增資料庫連接串:
<connectionStrings>
<add name ="pubsConString" connectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
</connectionStrings>
其次加入caching節:
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="pubs" connectionStringName="pubsConString" pollTime="900"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
下面是測試程式碼,當頁面載入的時候執行如下程式碼:
protected void Page_Load(object sender, EventArgs e) {
if (HttpContext.Current.Cache["xxx"] == null) {
SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs就是databases節指定的pubs,後面是表名
HttpContext.Current.Cache.Insert("xxx", "xxx", d);
Response.Write("Create new cache value is xxx.");
}
else{
Response.Write("Load data from cache,value is "+HttpContext.Current.Cache["xxx"].ToString());
}
}
當首次開啟該頁面將顯示:
Create new cache value is xxx.
刷新頁面後顯示:
Load data from cache,value is xxx
當使用查詢分析器修改authors裡面的資料再次刷新頁面將顯示:
Create new cache value is xxx.
這表示Cache正常運作了,當表格authors變化Cache裡面的內容會自動失效,我的應用程式也會重新建立一個Cache物件。
注意:SqlCacheDependency由兩個建構函數,SqlServer2000只支援兩個參數的,一個參數的支援SqlServer2005。