標籤:style blog http color os io 使用 strong ar
【名詞解釋】
緩衝(Cache)依賴,大白話解釋就是緩衝是否更新依賴於其它Object。那麼SqlCacheDependency指的就是Cache的資料更新依賴於SQL Server資料庫表的變化( 行層級更改)或者SQL 查詢結果的變化。
以前也總結過緩衝的使用
網頁輸出快取:我用ASP.NET緩衝之OutputCache
資料緩衝:我用ASP.NET緩衝之資料緩衝
但是對緩衝依賴還是很模糊,前陣子有幸在項目中實際運用了此類。現在結合自己的實際以及和網上大牛的經驗,給大家分享一下。
【使用背景】
首先你必須用ASP.Net和SQL Server開發應用,也就是SqlCacheDependency是基於微軟的那套體制。同學,如果你不是從事Net開發,先給個贊再Skip吧。
緩衝是用來提高應用效能,降低伺服器壓力。適用於資料不易變,資料易通用的情景, 對於動態查詢資料,例如資料分析,最好放棄使用緩衝。
【My Code】
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方法中即可。
接下來配置設定檔。
<caching>
<!--啟動緩衝依賴,每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。
我用ASP.NET緩衝之SQL資料緩衝依賴(SqlCacheDependency)