正文
一、SQL SERVER 7.0/2000和SQL SERVER 2005的簡介及比較
1.1 SQL SERVER 7.0/2000
SQL SERVER 7.0/2000沒有提供内置的支援資料緩存依賴的功能,是以隻能通過采用添加特定資料庫表、觸發器等方式,通過背景不斷輪詢資料庫來檢查資料更改。當在資料表上執行INSERT、UPDATE、 DELETE操作時将自動發出更改通知,是以隻能監測到表級,具體到哪一行是沒法跟蹤的。
使用方法步驟:
1.1.1 使用aspnet_regsql指令行或SqlCacheDependencyAdmin來配置連接配接資料庫。
1.1.1.1 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;
aspnet_regsql -S <server> -U sa -P sa -d <database> -ed 啟動資料庫的資料緩存依賴功能
aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et 啟動資料表的資料緩存依賴功能
1.1.1.2
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //啟動資料庫的資料緩存依賴功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //啟用資料表緩存
推薦這段代碼寫在Global.asax的Application_Start方法中,以便應用程式啟動的時候就啟用資料庫和資料表的緩存依賴功能。
1.1.2 配置Web.config
<sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>結點下,例如:
代碼
<caching>
<!--啟動緩存依賴,每5秒輪詢一次-->
<sqlCacheDependency enabled="true" pollTime="5000">
<databases>
<add name="Open1202" connectionStringName="ConnectionString" pollTime="5000"/>
</databases>
</sqlCacheDependency>
</caching>
注意沒有指定<database>節點的話可能報錯:無法在配置中找到“資料庫名稱 ”資料庫。
1.1.3 應用程式資料緩存中使用(還可以在資料源控件、輸出緩存整個頁面時使用,這裡就不介紹了,下同)
SqlCacheDependency scd = new SqlCacheDependency("資料庫名稱","表名");
Cache.Insert(...,scd,...);
1.2 SQL SERVER 2005
内置支援SQL資料緩存依賴,内置通知傳遞服務,能夠提供更小粒度的資料更改監測,使用和配置簡單。
1.2.1 檢測是否已經啟用Service Broker
Select DATABASEpRoPERTYEX('資料庫名稱','IsBrokerEnabled') -- 1 表示已經啟用 0 表示沒有啟用
這個地方我看有些朋友翻譯的成“是否能啟用”,這是不對的,這裡我把英文原文帖出來:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled. ”。
依據我的經驗,如果直接在目前SqlServer2005上建立一個資料庫的話,預設是打開的,如果是從其他地方資料庫導過來的,導入之後預設關閉了。(可能有不準确,大家可以自己試驗一下測試一下)。如果已經打開可直接調到1.2.2。
1.2.1.1 啟用Service Broker
ALTER DATABASE 資料庫名稱 SET ENABLE_BROKER;
2009-5-26補充: 如果執行此語句超過10秒或處于假死狀态,請重新開機資料庫,什麼都别做先執行這個語句就行了!
1.2.2 在實作基于服務的SQL資料緩存依賴過程中,需要顯式調用SqlDependency.Start來啟動接受依賴項更改通知的偵聽器。
SqlDependency.Start(connectionString); //推薦将這段代碼加到Global.asax的Application_Start方法中,
SqlDependency.Stop(connectionString); //用于關閉,可加在Global.asax的Application_End方法中。
1.2.3 應用程式資料緩存中使用
SqlCommand cmd = new SqlCommand(sql,conn);
SqlCacheDependency scd = new SqlCacheDependency(cmd);
Cache.Insert(...,scd,...);
注意:
a). 必須設定完全限定名稱的資料表。即表名前面需要加所有者,如dbo.test。
b). 必須明确設定所通路資料庫列名稱,不能使用“*”。
c). 必須保證不是聚合函數。如COUNT、MAX等。
1.3 比較、差別
SQL SERVER 7.0/2000
SQL SERVER 2005
實作機制
輪詢
通知傳遞服務(Service Broker)
是否需要配置啟用
需要
不需要,内置支援
資料更改檢測
限于表級更改監測
表級、行級更改監測
并且很明顯,SQL SERVER 2005的緩存機制更加高效。另外,SqlCacheDependency類還特别結合SQL SERVER 2005 進行了優化:
a). 使用SQL SERVER 2005 時,SqlCacheDependency類支援與System.Data.SqlClient.SqlDependency類進行內建。應用程式可建立SqlDependency對象,并通過OnChanged事件處理程式接受通知進行注冊。這樣,應用程式不僅可以使用Sql server 2005的查詢通知機制來監測使用SQL查詢結果無效的資料更改,并将緩存對象從緩存中移除,而且還可以輕松擷取資料更改通知,以便重新整理緩存。(從這裡可以看出,當觸發onRemoveCallback委托的時候,資料已經從緩存裡面删除了,這樣一來可以手動在委托裡面添加緩存,或者幹脆設定成null,讓他下次調用的時候再緩存。)
b). 不僅向應用程式添加緩存依賴項,還可以與@OutputCache指令一起使用,以生成依賴于SqlServer資料庫表的輸出緩存的頁面或使用者控件。對于使用者控件,@OutputCache指令不支援使用SQL SERVER 2005 的查詢通知(即onRemoveCallback委托)。
二、System.Web.Caching.Cache Insert和Add差別
2.1 Add方法
object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
2.2 Insert方法
void Insert(string key, object value); //永不過期
void Insert(string key, object value, CacheDependency dependencies);
void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);
//絕對時間過期:
void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);
void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
2.3 比較、差別
a). Insert方法支援5種重載,使用靈活,而Add方法必須提供7個參數;
b). Add方法可以傳回緩存項的資料對象,Insert 傳回Void;
c). 添加重複緩存情況下,Insert會替換該項,而Add方法會報錯。
a). 永不過期
Insert(string key, object value);
b). 絕對時間過期
DateTime.Now.AddSeconds(10)表示緩存在10秒後過期,TimeSpan.Zero表示不使用平滑過期政策。
例:Cache.Insert("Data", ds,null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
c). 變化時間過期(平滑過期)
DateTime.MaxValue表示不使用絕對時間過期政策,TimeSpan.FromSeconds(10)表示緩存連續10秒沒有通路就過期。
例:Cache.Insert("Data", ds, null, DateTime.MaxValue, TimeSpan.FromSeconds(10));
三、 CacheDependency、AggregateCacheDependency、SqlCacheDependency
3.1 CacheDependency是AggregateCacheDependency和SqlCacheDependency的父類。主要用于在應用程式資料緩存對象與檔案、緩存鍵、檔案或緩存鍵的數組或另外一個CacheDependency對象之間建立依賴關系。CacheDependency監視依賴關系比便在任何對象更改時自動移除緩存對象。CacheDependency可以監測一組(到檔案或目錄的)檔案路徑的更改情況。
3.2 AggregateCacheDependency主要用于實作聚合緩存依賴。如一筆資料同時對兩個表進行緩存依賴,一旦其中任何一個表資料更改緩存将失效。
3.3 SqlCacheDependency将應用程式資料緩存對象、頁面輸出緩存、資料源控件等與指定SQL Server資料庫表或Sql Server 2005 查詢結果之間建立緩存依賴關系,在表發生更改(Sql Server 2005 行級别更改)時,自動從緩存中删除和重新添加與該表關聯的緩存對象。一般而言:
SqlCacheDependency (SqlCommand) 用于SQL SERVER 2005
SqlCacheDependency (資料庫名, 表名) 用于SQL SERVER 7.0/2000
補充
注意修改Web.config連接配接資料庫的代碼和Global.asax中對應SQL2000和2005不同的啟動緩存代碼!
本文轉自over140 51CTO部落格,原文連結:http://blog.51cto.com/over140/586709,如需轉載請自行聯系原作者c