我用ASP.NET緩存之SQL數據緩存依賴(SqlCacheDependency)


【名詞解釋】

緩存(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方法中即可。

接下來配置配置文件。

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM