ASP.NET MVC 資料庫依賴緩衝的實現

來源:互聯網
上載者:User

標籤:

當資料庫中的資訊發生變化的時候,應用程式能夠擷取變化的通知是緩衝依賴得以實現的基礎。應用程式可以通過輪詢擷取資料變化的資訊,使用輪詢的話也不可能重新查一次後再和以前的資料做比較,如果這樣的話如果我一個表裡面有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 資料庫依賴緩衝的實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.