【名詞解釋】
緩存(Cache)依賴,大白話解釋就是緩存是否更新依賴於其它Object。那么SqlCacheDependency指的就是Cache的數據更新依賴於SQL Server數據庫表的變化( 行級別更改)或者SQL 查詢結果的變化。
以前也總結過緩存的使用
頁面輸出緩存:我用ASP.NET緩存之OutputCache
數據緩存:我用ASP.NET緩存之數據緩存
但是對緩存依賴還是很模糊,前陣子有幸在項目中實際運用了此類。現在結合自己的實際以及和網上大牛的經驗,給大家分享一下。
【使用背景】
首先你必須用ASP.Net和SQL Server開發應用,也就是SqlCacheDependency是基於微軟的那套體制。同學,如果你不是從事Net開發,先給個贊再Skip吧。
緩存是用來提高應用性能,降低服務器壓力。適用於數據不易變,數據易通用的情景, 對於動態查詢數據,例如數據分析,最好放棄使用緩存。
【我的代碼】
SqlCacheDependency通俗的說利用SQL Server的通信機制,當數據表發生變化時,通知應用程序時刪除原有的緩存,更新新的數據。
首先需要檢查SqlServer是否啟用Service Broker。
Select DATABASEpRoPERTYEX('數據庫名稱','IsBrokerEnabled') -- 1 表示已經啟用 0 表示沒有啟用
啟用語句
ALTER DATABASE 數據庫名稱 SET ENABLE_BROKER;
運行啟用語句,會出現假死情況,不要緊,停止查詢,重新查詢一次就可以。
上面這些來自於網上的一些經驗,個人在實際中並沒有出現這些情況,狀態=0 ,仍然可以使用。我用的是SQL Serve2008,個人覺得高版本的Sql Server 已經不在將這些作為必須條件(個人觀點,不同意見,歡迎討論)。畢竟Net開發走的是一條傻瓜化編程道路。
接下來就是配置數據庫緩存通知。兩種方法(MSDN),個人建議采用第二種。
第一種利用aspnet_regsql.exe(位於Windows\Microsoft.NET\Framework\[版本]文件夾中) 工具配置數據庫和表開啟緩存通知功能。你只需要記住如下命令就能開啟:
aspnet_regsql -S localhost -E -d RWWW -ed -t Options -et
每個命令代表什么含義,網上有詳細的解釋。有興趣的同學可以去了解。運行命令后,配置就可以。這里特別需要注意大小寫,筆者在開發中就將表名全部弄成大寫,結果花了一個小時的時間,程序始終運行不起來,一直在報錯,提示沒有為SQL緩存通知啟用數據庫。結果最后才發現大小寫不對。
第二種就是利用SqlCacheDependencyAdmin類
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //啟動數據庫的數據緩存依賴功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //啟用數據表緩存
將此兩行代碼放入Global中Start方法中即可。
接下來配置配置文件。
<!--啟動緩存依賴,每5秒輪詢一次-->
<sqlCacheDependency enabled="true" pollTime="5000">
<databases>
<add name="WWWAccount" connectionStringName="ConnectionString" pollTime="5000"/>
</databases>
</sqlCacheDependency>
</caching>
這里基本就是固定格式,必須這樣配置才可以。
最后將緩存加入代碼中即可,廢話不多說,直接上代碼。開發中用到了EF的東東。
//判斷是否已緩存 if (System.Web.HttpContext.Current.Cache["Link"] == null) { //如果沒有緩存 重新獲取數據 var links = db.WWW_Link.AsQueryable(); //添加到緩存中 System.Web.HttpContext.Current.Cache.Insert( "Link", links, new SqlCacheDependency("WWWAccount", "WWW_Link") ); //返回數據 return links; } //如果已經緩存 返回緩存數據 return System.Web.HttpContext.Current.Cache["Link"] as IQueryable<WWW_Link>;
當表WWW_Link發生變化時,Cache["Link"]會自動更新。這里主意SqlCacheDependency 的第一個參數,它等於App.config中節點name=WWWAccount。