如何在ASP.NET2.0下面使用基於資料庫(SqlServer2000)的Cache

來源:互聯網
上載者:User
在.NET1.1下面Cache只能基於檔案系統、對象等做Cache的依賴項,但是在.NET 2.0提供了一個新的依賴項SqlCacheDependency,這個項使我們Cache依賴資料庫的變化來改變。雖然這做法看起來和1.1裡面的變通做法相似,但是它們之間還是有本質的區別(SqlCacheDependency對象的提供)。(1.1的變通做法是為資料表建立觸發器,然後該觸發器在觸發的時候會修改一個本地檔案,系統中的某一個Cache的依賴項就是這個本地的檔案,這樣來通知Cache所緩衝的資料變化了)

     .NET 2.0的SqlCacheDependency可以在SqlServer2000以後的版本使用,本文介紹在Sql Server 2000下的使用方法,Sql Server 2005的稍有不同。

       首先需要安裝.NET 2.0的架構,當然Sql Server 2000一定要有了。在.NET 2.0裡微軟提供了一個工具 + 生產力:aspnet_regsql(和aspnet_regiis在同一個目錄下面),這是一個命令列工具,該命令列參數可以通過aspnet_regsql -?獲得。這裡我們關心下面幾個參數:-ed為SQL緩衝依賴項啟動資料庫,-E使用當前的windows憑據進行身分識別驗證,-d用於應用伺服器的資料庫名稱,如果未指定任何資料庫名稱,則使用預設資料庫“aspnetdb”。本文中將使用微軟的樣本資料庫pubs。那麼我們就要使用下面的命令列來建立緩衝依賴資料庫:

aspnet_regsql -ed -E -d pubs
(注意:這裡的命令列參數是去分大小寫)

     當執行完這個命令後,我們可以開啟pubs資料庫看看發生了什麼變化,首先多了一個表:AspNet_SqlCacheTablesForChangeNotification,這個表裡面有3個欄位,tableName:監視的表名稱,notificationCreated:建立時間。changeId:變化編號(累加欄位)。還可以看到該資料庫多了幾個預存程序,他們分別是:

AspNet_SqlCacheRegisterTableStoredProcedure,

AspNet_SqlCacheUnRegisterTableStoredProcedure,AspNet_SqlCacheUpdateChangeIdStoredProcedure,AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,AspNet_SqlCachePollingStoredProcedure      從字面上這幾個預存程序都很好理解,該預存程序的詳細內容可以在查詢分析器裡面開啟後查看。為了可以監視一個表的變化,我們需要通過執行AspNet_SqlCacheRegisterTableStoredProcedure預存程序來指定一個需要監視的表,當然也可以通過工具 + 生產力aspnet_regsql來指定,命令列如下:aspnet_regsql -et -E -d pubs -t authors      通過執行上面的命令以後,aspnet_regsql會為authors建立一個觸發器,下面是我執行該命令後建立的觸發器:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GOALTER  TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [authors]
                       FOR INSERT, UPDATE, DELETE AS BEGIN
                       SET NOCOUNT ON
                       EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
                       END
                      
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
     從觸發器可以看出,當對authors表插入,刪除以及更新的時候都會執行預存程序AspNet_SqlCacheUpdateChangeIdStoredProcedure,該預存程序會向AspNet_SqlCacheTablesForChangeNotification表裡面添加一條記錄。記錄如下:
tableName    notificationCreated      changeId   
authors      2006-06-20 09:38:26.267  1
     當你對authors裡面的資料做任何修改changeId都會累加,其他欄位不變化。      接著要在web.config裡面添加一些內容就可以使用了。首先添加資料庫連接串:
<connectionStrings>
    <add name ="pubsConString" connectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
  </connectionStrings>其次添加caching節:
<system.web>
    <caching>
      <sqlCacheDependency enabled="true">
        <databases>
          <add name="pubs" connectionStringName="pubsConString" pollTime="900"/>
        </databases>
      </sqlCacheDependency>
    </caching>
</system.web> 下面是測試代碼,當頁面載入的時候執行如下代碼:protected void Page_Load(object sender, EventArgs e) {
        if (HttpContext.Current.Cache["xxx"] == null) {
            SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs就是databases節指定的pubs,後面是表名
            HttpContext.Current.Cache.Insert("xxx", "xxx", d);
            Response.Write("Create new cache value is xxx.");
        }
        else{
            Response.Write("Load data from cache,value is "+HttpContext.Current.Cache["xxx"].ToString());
        }
    } 當首次開啟該頁面將顯示:
Create new cache value is xxx. 重新整理頁面後顯示:
Load data from cache,value is xxx 當使用查詢分析器修改authors裡面的資料再次重新整理頁面將顯示:
Create new cache value is xxx. 這說明Cache正常工作了,當表authors變化Cache裡面的內容會自動失效,我的應用程式也會重新建立一個Cache對象。 注意:SqlCacheDependency由兩個建構函式,SqlServer2000隻支援兩個參數的,一個參數的支援SqlServer2005。  有不正確的地方請指正,謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.