天天看點

CacheDependency、SqlCacheDependency Asp.net 2.0和Sql的緩存管理和使用

AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的緩存管理和使用ObjectBuilder改造PetShop4 的緩存示例

這兩天 PetShop is Evil?等對PetShop 的讨論很多,我在這裡也發一篇湊湊熱鬧。我下面主要是對Asp.net 2.0新增的緩存管理方面的内容和PetShop 4的緩存處理的一個認識,大家一起來學習,交流才能進步,歡迎拍磚頭。

      Asp.net 2.0新增的緩存管理

      CacheDependency跟蹤緩存依賴項,緩存依賴項可以是應用程式的 Cache 中的檔案、目錄或與其他對象的鍵。

   SqlCacheDependency

類在所有受支援的 SQL Server 版本 (7.0, 2000, 2005) 上監視特定的 SQL Server 資料庫表,以便在該表發生更改時,自動從 Cache 中删除與該表關聯的項。 資料庫表發生更改時,将自動删除緩存項,并向 Cache 中添加新版本的項。在使用 SQL Server 2005 資料庫時,SqlCacheDependency 類還支援與 System.Data.SqlClient.SqlDependency 類進行內建。使用 SQL Server 2005 的查詢通知機制來檢測使 SQL 查詢結果無效的資料更改。與 SQL 查詢關聯的任何緩存項都将從 System.Web.Caching.Cache 中移除。在使用 SQL Server 2005 時,可以使用 SqlCacheDependency 類向應用程式的 Cache 添加依賴于 SQL Server 資料庫表或 SQL 查詢的項

   AggregateCacheDependency

類監視依賴項對象的集合,以便在任何依賴項對象更改時,該緩存項都會自動移除。數組中的對象可以是

CacheDependency

對象、

SqlCacheDependency

對象、從

派生的自定義對象或這些對象的任意組合.

AggregateCacheDependency

類與

類的不同之處在于前者允許您将不同類型的多個依賴項與單個緩存項關聯。例如,如果您建立一個從 SQL Server 資料庫表和 XML 檔案導入資料的頁,則可建立一個

對象來表示資料庫表的依賴項,以及一個

來表XML 檔案的依賴項。可建立

類的一個執行個體,将每個依賴項添加到該類中,而不是為每個依賴項調用 Cache.Insert 方法。然後,可使用單個Insert 調用使該頁依賴于

執行個體。

ASP.NET 2.0 允許您使用 SqlCacheDependency 類建立依賴于資料庫中表或行的緩存項。當表中或特定行中發生更改時,帶有依賴項的項便會失效,并會從緩存中移除。可以在 Microsoft SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中設定表的依賴項。如果您使用 SQL Server 2005,還可以設定特定記錄的依賴項。

ASP.NET 2.0 SQL 緩存依賴項提供以下功能:

1.      SQL 緩存依賴項可用于應用程式緩存和頁輸出緩存。

2.      可在 SQL Server 7.0 及更高版本中使用 SQL 緩存依賴項。

3.      可以在網絡園(一台伺服器上存在多個處理器)或網絡場(多台伺服器運作同一應用程式)中使用 SQL 緩存依賴項。

4.      與 SQL 緩存依賴項關聯的資料庫操作比較簡單,是以不會給伺服器帶來很高的處理成本。

ASP.NET 2.0 為 SQL Server 7.0 和 SQL Server 2000 的緩存依賴項實作了一個輪詢模型。ASP.NET 程序内的一個線程會以指定的時間間隔輪詢 SQL Server 資料庫,以确定資料是否已更改。如果資料已更改,緩存依賴項便會失效,并從緩存中移除。可以在 Web.config 檔案中以聲明方式指定應用程式中的輪詢間隔,也可以使用

類以程式設計方式指定此間隔。

對于 SQL Server 7.0 和 SQL Server 2000,SQL 緩存依賴項僅限于表級别的資料更改。可以将 ASP.NET 配置為輪詢資料庫來确定表中的更改,但不能确定特定行中的更改。

啟用 SQL 緩存

為了在 SQL Server 7.0 和 SQL Server 2000 中使用 SQL 緩存依賴項,必須先将 SQL Server 配置為支援緩存依賴項。ASP.NET 提供了一些實用工具,可用于配置 SQL Server 上的 SQL 緩存,其中包括一個名為 Aspnet_regsql.exe 的工具和

SqlCacheDependencyAdmin

類.

SQL Server 2005 為緩存依賴項實作的模型不同于 SQL Server 7.0 和 SQL Server 2000 中的緩存依賴項模型。在 SQL Server 2005 中,不需要執行任何特殊的配置步驟來啟用 SQL 緩存依賴項。此外,SQL Server 2005 還實作了一種更改通知模型,可以向訂閱了通知的應用程式伺服器發送通知,而不是依賴早期版本的 SQL Server 中必需的輪詢模型。

SQL Server 2005 緩存依賴項在接收通知的更改類型方面更具靈活性。SQL Server 2005 監控對特定 SQL 指令的結果集的更改。如果資料庫中發生了将修改該指令的結果集的更改,依賴項便會使緩存的項失效。此功能使得 SQL Server 2005 可以提供行級别的通知。

MS PetShop4.0對 緩存的管理

在PetShop中,需要對資料表實作Cache。這些Cache都存放在.Net為Web系統提供的Cache集合對象System.Web.Caching.AggregateCacheDependency中,下面代碼中的紅色标明的代碼就是AggregateCacheDependency緩存管理的代碼。

/// <summary>

    /// This is the base class for SQL2KCacheDependency implementation that encapsulates common

    /// algorithm to retrieve database and table names from configuration file and create

    /// the necessary AggregateCacheDependency object

    /// </summary>

    public abstract class TableDependency : PetShop.ICacheDependency.IPetShopCacheDependency {

        // This is the separator that's used in web.config

        protected char[] configurationSeparator = new char[] { ',' };

        protected AggregateCacheDependency dependency = new AggregateCacheDependency();

        /// <summary>

        /// The constructor retrieves all related configuration and add CacheDependency object accordingly

        /// </summary>

        /// <param name="configKey">Configuration key for specific derived class implementation</param>

        protected TableDependency(string configKey) {

            string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];

            string tableConfig = ConfigurationManager.AppSettings[configKey];

            string[] tables = tableConfig.Split(configurationSeparator);

            foreach (string tableName in tables)

                dependency.Add(new SqlCacheDependency(dbName, tableName));

        }

        public AggregateCacheDependency GetDependency() {

            return dependency;

        }

}

下面這個圖就是PetShop 4的緩存管理類圖

自由、創新、研究、探索……