程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 如何在asp.net2.0下面使用基於數據庫(sqlserver2000)的cache

如何在asp.net2.0下面使用基於數據庫(sqlserver2000)的cache

編輯:.NET實例教程

在.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
GO
ALTER  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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved