在.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。