SQL資料緩衝依賴 [SqlServer | Cache | SqlCacheDependency ]

來源:互聯網
上載者:User

 

前言

     本文主要是對《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.asax的Application_Start方法中,以便應用程式啟動的時候就啟用資料庫和資料表的緩衝依賴功能。

                    1.1.2     配置Web.config

                         <sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>結點下,例如:

代碼

    <caching>
      <!--啟動緩衝依賴,每5秒輪詢一次-->
      <sqlCacheDependency enabled="true" pollTime="5000">
        <databases>
          <add name="Open1202" connectionStringName="ConnectionString" pollTime="5000"/>
        </databases>
      </sqlCacheDependency>
    </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;                  

                              2009-5-26補充: 如果執行此語句超過10秒或處於假死狀態,請重啟資料庫,什麼都別做先執行這個語句就行了!   

                    1.2.2     在實現基於服務的SQL資料緩衝依賴過程中,需要顯式調用SqlDependency.Start來啟動接受依賴項更改通知的接聽程式。

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

                              SqlDependency.Stop(connectionString);                         //用於關閉,可加在Global.asax的Application_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方法會報錯。

          2.4  到期策略 (2009-12-7 add 參照來源)

               a).    永不到期
        Insert(string key, object value);

               b).    絕對時間到期

        DateTime.Now.AddSeconds(10)表示緩衝在10秒後到期,TimeSpan.Zero表示不使用平滑到期策略。

        例:Cache.Insert("Data", ds,null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);    

               c).    變化時間到期(平滑到期)

         DateTime.MaxValue表示不使用絕對時間到期策略,TimeSpan.FromSeconds(10)表示緩衝連續10秒沒有訪問就到期。

        例:Cache.Insert("Data", ds, null, DateTime.MaxValue, TimeSpan.FromSeconds(10));

 

 

     三、     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

 

補充

      1.      2009-5-26      範例:緩衝依賴範例 原始碼 

            注意修改Web.config串連資料庫的代碼和Global.asax中對應SQL2000和2005不同的啟動緩衝代碼!

 

結束

     惱於搜來搜去就那麼幾篇文章,全是轉載,迫切需要要深入的瞭解緩衝方面的知識,猛想起自己花10塊買的正版<<ASP.NET 2.0開發指南>>還沒有仔細讀過,果然是本好書!寫得極其詳細,這裡就整理提取一下然後貼上來以防止經常背著這本818頁的書到處跑。歡迎指正: )

     

聯繫我們

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