asp.net 2.0 提供了一個新的數據緩存功能,就是利用sql server2005 的異步通知功能來實現緩存
1.首先在sqlserver2005 中創建一個test的數據庫.
在SQL Server 2005上執行
ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;語句讓相應的數據庫啟用監聽服務,以便支持SqlDependency特性。
添加一個 employee的數據庫表.
2使用 vs2005 創建一個新的asp.net項目.
web.config如下
3.編寫global.asax文件,啟動監聽sql2005通知事件.
4.編寫數據訪問代碼.創建一個EmployeeData的類,代碼如下
這里需要注意的是 select語句的寫法, 不能使用 select * 的方式,一定要在表名前加架構名稱 如我們這里的 dbo.employee.
5.編寫測試頁面代碼.
6.插入后臺代碼
轉自:http://www.49028c.com/wzyexf/archive/2008/12/26/1363195.html
前言
本文主要是對《ASP.NET 2.0開發指南》——<數據緩存>章節內容的提取并略有補充。
參考資料
1.《ASP.NET 2.0開發指南》
2..NET 2.0 SqlDependency快速上手指南
支持數據庫
SQL SERVER 7.0/2000/2005版本
正文
一、SQL SERVER 7.0/2000和SQL SERVER 2005的簡介及比較
1.1SQL SERVER 7.0/2000
SQL SERVER 7.0/2000沒有提供內置的支持數據緩存依賴的功能,所以只能通過采用添加特定數據庫表、觸發器等方式,通過后臺不斷輪詢數據庫來檢查數據更改。當在數據表上執行INSERT、UPDATE、DELETE操作時將自動發出更改通知,所以只能監測到表級,具體到哪一行是沒法跟蹤的。
使用方法步驟:
1.1.1使用aspnet_regsql命令行或SqlCacheDependencyAdmin來配置連接數據庫。
1.1.1.1ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;
aspnet_regsql -S <server> -Usa -P sa -d <database>-ed啟動數據庫的數據緩存依賴功能
aspnet_regsql -S <server> -Usa -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>結點下,只有一個數據庫的話不必指定下一級<database>結點
1.1.3應用程序數據緩存中使用(還可以在數據源控件、輸出緩存整個頁面時使用,這里就不介紹了,下同)
SqlCacheDependency scd = new SqlCacheDependency("數據庫名稱","表名");
Cache.Insert(...,scd,...);
1.2SQL 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;
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 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.1Add方法
object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
2.2Insert方法
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方法會報錯。
三、CacheDependency、AggregateCacheDependency、SqlCacheDependency
3.1CacheDependency是AggregateCacheDependency和SqlCacheDependency的父類。主要用于在應用程序數據緩存對象與文件、緩存鍵、文件或緩存鍵的數組或另外一個CacheDependency對象之間建立依賴關系。CacheDependency監視依賴關系比便在任何對象更改時自動移除緩存對象。CacheDependency可以監測一組(到文件或目錄的)文件路徑的更改情況。
3.2AggregateCacheDependency主要用于實現聚合緩存依賴。如一筆數據同時對兩個表進行緩存依賴,一旦其中任何一個表數據更改緩存將失效。
3.3SqlCacheDependency將應用程序數據緩存對象、頁面輸出緩存、數據源控件等與指定SQL Server數據庫表或Sql Server 2005 查詢結果之間建立緩存依賴關系,在表發生更改(Sql Server 2005行級別更改)時,自動從緩存中刪除和重新添加與該表關聯的緩存對象。一般而言:
SqlCacheDependency (SqlCommand)用于SQL SERVER 2005
SqlCacheDependency (數據庫名, 表名)用于SQL SERVER 7.0/2000
結束
惱于搜來搜去就那么幾篇文章,全是轉載,迫切需要要深入的了解緩存方面的知識,猛想起自己花10塊買的正版<<ASP.NET 2.0開發指南>>還沒有仔細讀過,果然是本好書!寫得極其詳細,這里就整理提取一下然后貼上來以防止經常背著這本818頁的書到處跑。歡迎指正: )
轉自:http://www.49028c.com/over140/archive/2009/01/15/1376318.html
錯誤:無法啟用數據庫中的 Service Broker
解決方案:
Service Broker 標識符在同一網絡上的所有實例中應是唯一的。否則,消息可能被誤傳。
那么怎么能讓數據庫也能使用Service Broker呢?
ALTER DATABASE TpriUserManage SET NEW_BROKER
ALTER DATABASE TpriUserManage SET ENABLE_BROKER
新聞熱點
疑難解答