標籤:
當資料庫中的資訊發生變化的時候,應用程式能夠擷取變化的通知是緩衝依賴得以實現的基礎。應用程式可以通過輪詢擷取資料變化的資訊,使用輪詢的話也不可能重新查一次後再和以前的資料做比較,如果這樣的話如果我一個表裡面有1000行資料我要是讀100次的話是不是得比較1000 x 100 次,顯然這種方法是不可行的,那怎麼辦呢?大家都學過觸發器吧,實現資料庫依賴緩衝的輪詢機制就是通過觸發器來實現的。
實現步驟簡單分析:
首先建立一個用於記錄監控資訊的表,表的欄位就兩個一個是表名,一個是版本號碼。然後,對需要監控的變增加一個觸發器,當表的內容發生變化的時候進行觸發。我們可以用insert delete update 觸發器,如果一旦觸發以上動作就在把那個監控表的版本號碼欄位加1。
上面的步驟要我們自己動手實現起來很麻煩,但微軟早就為我們提供好了一個工具叫Aspnet_regsql.exe 這個工具位於C:\Windows\Microsoft.NET\Framework\v4.0.30319這個路徑下(也不一定但是一般就是這個路徑)好了有工具了具體怎麼用呢?開啟cmd,輸入以下命令列切換到aspnet_regsql.exe的運行根目錄。
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
具體協助請執行命令aspnet_regsql /? 查看下面列出本文要用到的參數
- -S 伺服器
- -E 使用當前Windows憑據進行身分識別驗證
- -U 使用者名稱
- -P 密碼
- -d 資料庫名稱,預設為aspnetdb資料庫
- -ed 為資料庫開啟SQL緩衝依賴支援
- -dd 關閉資料庫的SQL緩衝依賴支援
- -et 指定SQL緩衝依賴使用的表,需要使用-t指定表名
- -dt 禁用SQL 緩衝依賴使用的表,需要使用-t指定表名
- -t 指定表名
- -lt 列出啟用緩衝依賴的表名
然後就可以通過命令對資料庫House啟用Home表緩衝依賴,具體命令如下:
aspnet_regsql -S . -E -ed -d House -et -t Home
運行後資料庫會發生以下變化:
1. 增加了一個名稱為AspNet_SqlCacheTablesForChangeNotification的表
2. Home表中增加了一個觸發器
SET ANSI_NULLS ONSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [Home_AspNet_SqlCacheNotification_Trigger] ON [dbo].[Home] FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N‘Home‘ END
3. 增加了幾個預存程序 如所示:
開啟AspNet_SqlCacheTablesForChangeNotification的表後會發現以下幾個欄位:
基本上和開始描述的步驟差不多,它這還多了一個有關時間的列,下面手動修改一個Home表中的資料看看這個監視表有什麼變化。
結果 changeId 數值改變了!應用程式就是定期查詢這個表的變化然後確定是否需要更新緩衝。
資料庫配置完畢後,在ASP.NET MVC項目中進行配置,開啟Web.config在system.web 節點下加入以下代碼:
<!-- 基於資料庫的緩衝依賴 --> <caching> <sqlCacheDependency enabled="true" pollTime="30000"> <databases> <add name="pubs" connectionStringName="pubs" pollTime="500"/> </databases> </sqlCacheDependency> </caching>
其中 pollTime 屬性就是應用程式間隔多長時間主動訪問一次資料庫預設為1分鐘,最低為500ms,單位為ms。
在緩衝類中根據需求修改以下核心代碼:
SqlCacheDependency dependencies = string.IsNullOrEmpty(tableName) ? null : new SqlCacheDependency("PostCacheDependency", tableName); if (cacheTime != 0) { caches.Insert(key, data, dependencies, DateTime.UtcNow.AddMinutes(cacheTime), Cache.NoSlidingExpiration);//System.Web.Caching.Cache.NoAbsoluteExpiration } else { caches.Insert(key, data, dependencies, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0)); }
absoluteExpiration:表示所插入對象將到期並被從緩衝中移除的時間。 要避免可能的本地時間問題(例如從標準時間改為夏時制),請使用 System.DateTime.UtcNow
而不是 System.DateTime.Now 作為此參數值。 如果使用絕對到期,則 slidingExpiration 參數必須為 System.Web.Caching.Cache.NoSlidingExpiration。
slidingExpiration:表示最後一次訪問所插入對象時與該對象到期時之間的時間間隔。 如果該值等效於 20 分鐘,則對象在最後一次被訪問 20 分鐘之後將到期並被從緩衝中移除。簡單來說,就是自訪問起的20分鐘內不被訪問就移除緩衝。如果使用可調到期,則 absoluteExpiration 參數必須 System.Web.Caching.Cache.NoAbsoluteExpiration。
ASP.NET MVC 資料庫依賴緩衝的實現