Asp.net數據庫緩存依賴

 

前言

      本文主要是對《ASP.NET 2.0開發指南》——<數據緩存>章節內容的提取並略有補充。

參考資料

      1.      《ASP.NET 2.0開發指南》

      2.     .NET 2.0 SqlDependency快速上手指南

支持數據庫

      SQL SERVER 7.0/2000/2005版本

正文

一、SQL SERVER 7.0/2000和SQL SERVER 2005的簡介及比較

           1.1      SQL SERVER 7.0/2000

                    SQL SERVER 7.0/2000沒有提供內置的支持數據緩存依賴的功能,所以只能通過採用添加特定數據庫表、觸發器等方式,通過後臺不斷輪詢數據庫來檢查數據更改。當在數據表上執行INSERT、UPDATE、 DELETE操作時將自動發出更改通知,所以只能監測到表級,具體到哪一行是沒法跟蹤的。

                     使用方法步驟:

                     1.1.1      使用aspnet_regsql命令行或SqlCacheDependencyAdmin來配置連接數據庫。

                          1.1.1.1     ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;    

                               aspnet_regsql -S <server> -U sa -P sa -d <database> -ed      啓動數據庫的數據緩存依賴功能

                               aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et      啓動數據表的數據緩存依賴功能

                          1.1.1.2

                              SqlCacheDependencyAdmin.EnableNotifications(connectionString);      //啓動數據庫的數據緩存依賴功能                    

                              SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);         //啓用數據表緩存

                               推薦這段代碼寫在Global.asaxApplication_Start方法中,以便應用程序啓動的時候就啓用數據庫和數據表的緩存依賴功能。

                     1.1.2      配置Web.config

                         <sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>結點下,只有一個數據庫的話不必指定下一級<database>結點

                     1.1.3      應用程序數據緩存中使用(還可以在數據源控件、輸出緩存整個頁面時使用,這裏就不介紹了,下同)

                         SqlCacheDependency scd = new SqlCacheDependency("數據庫名稱","表名");                         

                         Cache.Insert(...,scd,...);          

           1.2      SQL SERVER 2005

                     內置支持SQL數據緩存依賴,內置通知傳遞服務,能夠提供更小粒度的數據更改監測,使用和配置簡單。

                     使用方法步驟:

                     1.2.1      檢測是否已經啓用Service Broker

                         Select DATABASEpRoPERTYEX('數據庫名稱','IsBrokerEnabled')           -- 1 表示已經啓用 0 表示沒有啓用

                          這個地方我看有些朋友翻譯的成“是否能啓用”,這是不對的,這裏我把英文原文帖出來:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled.     ”。        

                          依據我的經驗,如果直接在當前SqlServer2005上新建一個數據庫的話,默認是打開的,如果是從其他地方數據庫導過來的,導入之後默認關閉了。(可能有不準確,大家可以自己試驗一下測試一下)。如果已經打開可直接調到1.2.2。

                          1.2.1.1      啓用Service Broker                    

                              ALTER DATABASE 數據庫名稱 SET ENABLE_BROKER;                              

                     1.2.2      在實現基於服務的SQL數據緩存依賴過程中,需要顯式調用SqlDependency.Start來啓動接受依賴項更改通知的偵聽器。

                              SqlDependency.Start(connectionString);                          //推薦將這段代碼加到Global.asaxApplication_Start方法中,

                              SqlDependency.Stop(connectionString);                          //用於關閉,可加在Global.asaxApplication_End方法中。

                     1.2.3      應用程序數據緩存中使用

                              SqlCommand cmd = new SqlCommand(sql,conn);                                   

                               SqlCacheDependency scd = new SqlCacheDependency(cmd);

                               Cache.Insert(...,scd,...);

                               注意:

                                    a).      必須設置完全限定名稱的數據表。即表名前面需要加所有者,如dbo.test。

                                    b).      必須明確設置所訪問數據庫列名稱,不能使用“*”。

                                    c).      必須保證不是聚合函數。如COUNT、MAX等。

                1.3      比較、區別

 

 
 

SQL SERVER 7.0/2000

SQL SERVER 2005

實現機制

輪詢

通知傳遞服務(Service Broker)

是否需要配置啓用

需要

不需要,內置支持

數據更改檢測

限於表級更改監測

表級、行級更改監測

 

                          並且很明顯,SQL SERVER 2005的緩存機制更加高效。另外,SqlCacheDependency類還特別結合SQL SERVER 2005 進行了優化:

                               a).      使用SQL SERVER 2005 時,SqlCacheDependency類支持與System.Data.SqlClient.SqlDependency類進行集成。應用程序可創建 SqlDependency對象,並通過OnChanged事件處理程序接受通知進行註冊。這樣,應用程序不僅可以使用Sql server 2005的查詢通知機制來監測使用SQL查詢結果無效的數據更改,並將緩存對象從緩存中移除,而且還可以輕鬆獲取數據更改通知,以便刷新緩存。(從這裏可以看出,當觸發onRemoveCallback委託的時候,數據已經從緩存裏面刪除了,這樣一來可以手動在委託裏面添加緩存,或者乾脆設置成null,讓他下次調用的時候再緩存。)

                               b).      不僅嚮應用程序添加緩存依賴項,還可以與@OutputCache指令一起使用,以生成依賴於SqlServer數據庫表的輸出緩存的頁面或用戶控件。對於用戶控件,@OutputCache指令不支持使用SQL SERVER 2005 的查詢通知(即onRemoveCallback委託)。

      二、System.Web.Caching.Cache Insert和Add區別

           2.1      Add方法

                     object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

           2.2      Insert方法

                     void Insert(string key, object value);

                    void Insert(string key, object value, CacheDependency dependencies);

                    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

                    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

                    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

           2.3      比較、區別

                a).      Insert方法支持5種重載,使用靈活,而Add方法必須提供7個參數;

                b).      Add方法可以返回緩存項的數據對象,Insert 返回Void;

                c).      添加重複緩存情況下,Insert會替換該項,而Add方法會報錯。

      三、      CacheDependency、AggregateCacheDependency、SqlCacheDependency

           3.1      CacheDependency是AggregateCacheDependency和 SqlCacheDependency的父類。主要用於在應用程序數據緩存對象與文件、緩存鍵、文件或緩存鍵的數組或另外一個 CacheDependency對象之間建立依賴關係。CacheDependency監視依賴關係比便在任何對象更改時自動移除緩存對象。 CacheDependency可以監測一組(到文件或目錄的)文件路徑的更改情況。

           3.2     AggregateCacheDependency主要用於實現聚合緩存依賴。如一筆數據同時對兩個表進行緩存依賴,一旦其中任何一個表數據更改緩存將失效。

           3.3      SqlCacheDependency將應用程序數據緩存對象、頁面輸出緩存、數據源控件等與指定SQL Server數據庫表或Sql Server 2005 查詢結果之間建立緩存依賴關係,在表發生更改(Sql Server 2005 行級別更改)時,自動從緩存中刪除和重新添加與該表關聯的緩存對象。一般而言:

                    SqlCacheDependency (SqlCommand)       用於SQL SERVER 2005

                    SqlCacheDependency (數據庫名, 表名)       用於SQL SERVER 7.0/2000

 

vs2005中啓用數據庫緩存依賴
aspnet_regsql.exe -S localhost -U sa -P sa -d hnfms -ed

aspnet_regsql.exe -S localhost -U sa -P sa -d hnfms -t Applys -et

數據庫端啓用緩存依賴

ALTER DATABASE hnfms SET ENABLE_BROKER;    

數據庫端查詢是否啓用緩存依賴

  Select DATABASEpRoPERTYEX('hnfms','IsBrokerEnabled')           -- 1 表示已經啓用 0 表示沒有啓用

Web.config中配置

<caching>
    <sqlCacheDependency enabled="true" pollTime="1000">
      <databases>         
      <!--這裏配置緩存依賴數據庫的連接,
      如果庫名填寫與實際的庫名不正確的話
      會出現"調用的目標發生異常"的錯誤-->
      <add name="hnfms" connectionStringName="hnfmsConnectionString"/>
     </databases>
    </sqlCacheDependency>
   </caching>

Gload.asxm中配置

void Application_Start(object sender, EventArgs e)
    {
        // 在應用程序啓動時運行的代碼
        System.Data.SqlClient.SqlDependency.Start(System.Configuration.ConfigurationManager.ConnectionStrings["hnfmsConnectionString"].ConnectionString);
    }
   
    void Application_End(object sender, EventArgs e)
    {
        // 在應用程序關閉時運行的代碼
        System.Data.SqlClient.SqlDependency.Stop(System.Configuration.ConfigurationManager.ConnectionStrings["hnfmsConnectionString"].ConnectionString);
    }

 

 

 

參考:http://www.simple-talk.com/sql/t-sql-programming/using-and-monitoring-sql-2005-query-notification/

 

  void Application_Start(object sender, EventArgs e)
    {
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConAW"].ConnectionString;
        System.Data.SqlClient.SqlDependency.Start(connectionString);

    }
   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章