1. 程式人生 > >使用 SQL 快取依賴項,資料庫快取依賴 (附例項)

使用 SQL 快取依賴項,資料庫快取依賴 (附例項)

使用 SQL 快取依賴項

最簡單的快取策略就是使快取資料在一個指定的時間週期後過期。但是這個簡單的方法意味著快取資料沒有保持與底層資料來源的聯絡,從而導致過期資料長時儲存或當前資料很快過期。更好的方法是使用 SqlCacheDependency 類,這樣資料一直被快取,直到其底層資料在 SQL 資料庫中被修改。本篇教程將講解怎樣使用這個類。

Part 1

簡介

使用 ObjectDataSource 快取資料 和在架構中快取資料 教程中探討的快取技術使用基於時間的有效期 , 在指定的週期過後從快取中清除資料。該方法是平衡快取效能與資料過時的最簡單的方法。選擇 x 秒的有效期,頁面開發者雖然只能享受到 x 秒的快取帶來的好處,但可高枕無憂,因為資料的過期時間最多不會超過 x 秒。當然,對於靜態資料, x

 可以延長為 web 應用程式的生命週期,如 應用程式啟動時快取資料 教程所述。

快取資料庫資料時,人們常常會選用基於時間的有效期,因為其易於使用。但常常這不是個合適的方案。理想情況是:資料庫資料一直被快取,直到底層資料在資料庫中被修改;此時才清除快取。該方法能最大地獲得快取帶來的效能上的好處,同時使過時資料保持的時間最短。然而,為享受到這些好處,必須建立一套系統,該系統可以感知到底層資料庫資料發生了改變並從快取中清除相應的條目。在 ASP.NET 2.0 以前,頁面開發者負責實現該系統。

ASP.NET 2.0 提供了 SqlCacheDependency 類 以及必要的基礎架構 , 利用它們可以在資料庫發生了變化時感知到變化 , 從而清除相應的快取條目。有兩種技術可用於感知底層資料發生的變化:通知和輪詢。下面我們會討論通知和輪詢的不同之處,之後,我們將建立必要的基礎架構來支援輪詢,然後探討怎樣通過宣告和程式設計兩種方式來使用 SqlCacheDependency 類。

瞭解通知和輪詢

有兩種技術可用於感知資料庫中的資料發生的變化:通知和輪詢。使用通知時,對於某個具體查詢,如果自其上次執行以來其查詢結果已發生了改變,資料庫會自動通知 ASP.NET 執行時。使用輪詢時,資料庫伺服器儲存特定表最近發生更改時的資訊。 ASP.NET 執行時週期性地查詢資料庫,看哪些表的資料在快取後發生過改動。其資料改動過的那些表的相關快取條目會被清除。

選用通知技術時,需要的建立工作比輪詢少,並且具有更細的粒度,因為該技術在查詢級而不是在表級跟蹤變化。遺憾的是,只有在 Microsoft SQL Server 2005 的完整版,即非速成 (non-Express) 版中,才能使用通知。而對於 Microsoft SQL Server 從 7.0 到 2005 之間的所有版本 , 都可採用輪詢技術。由於這些教程使用的是 SQL Server 2005 Express 版,我們將集中探討建立和使用輪詢。有關 SQL Server 2005 的通知功能的更多資料,請參考本教程末尾的更多閱讀材料部分。

採用輪詢時 , 需配置資料庫 , 使其包含一個名為 AspNet_SqlCacheTablesForChangeNotification 的表 , 該表有三列– tableName 、notificationCreated 和changeId 。對於那些在 web 應用程式的 SQL 快取依賴項中可能需要用到其資料的表,該表都有一條記錄與之對應。 tableName 列指定表名,而 notificationCreated 指示將該記錄新增到表中時的日期和時間。changeId 列為 int 型別 , 其初始值為0 。每次修改對應的表時 , 其值遞增。

除了 AspNet_SqlCacheTablesForChangeNotification 表之外,資料庫還需要對可能出現在 SQL 快取依賴項中的每個表包含一個觸發器。每當在 AspNet_SqlCacheTablesForChangeNotification 表中插入、更新、刪除一條記錄,或表中 changeId 值遞增時,會執行這些觸發器。

在使用一個SqlCacheDependency 物件快取資料時 ,ASP.NET 執行時會跟蹤相應表的當前 changeId 。系統週期性地檢查資料庫,一旦發現某個 SqlCacheDependency 物件的 changeId 值不同於資料庫中的相應值,就清除該物件,因為 changeId 值不同意味著資料被快取後相應表又有了變化。


參考資料(附例項):

使用工具:

aspnet_regsql.exe

工具地址:C:\Windows\Microsoft.NET\Framework\v2.0.50727

先在命令地工具中通過命令:cmd進入到aspnet_regsql.exe所在目錄:cd C:\Windows\Microsoft.NET\Framework\v2.0.50727

遠端伺服器:128.45.4.34 

資料庫名:RMA_DWH

快取依賴的兩個表名:RMA_R_ARTICLE_LOCAL_ATTR、RMA_R_PURCHACE_ATTR

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -ed 
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_ARTICLE_LOCAL_ATTR -et
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_PURCHACE_ATTR -et


上面的指令碼執行之後,再在程式碼中配置web.config檔案,如下:

1:資料庫的連線字串

<connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=128.45.4.34;Initial Catalog=RMA_DWH;Persist Security Info=True;User ID=sa;Password=23WSXCDE#@;Max Pool Size = 51200;" providerName="System.Data.SqlClient"/>
  </connectionStrings>

2: 快取的配置項:

<caching>
      <sqlCacheDependency enabled="true" pollTime="1000" >
        <databases>
          <add name="RMA_DWH" connectionStringName="ConnectionString" />
        </databases>
      </sqlCacheDependency>
    </caching>

3:asp.net程式碼的使用:

protected void Page_Load(object sender, EventArgs e)
        {
            string TS;
            DateTime time = DateTime.Now;
            bool b = false;
            DataTable DT = new DataTable();
            <span style="color:#ff0000;">DataTable DT_Article =(DataTable)Cache["ARTICLE"];</span>
            if (DT_Article != null)
                DT = DT_Article;
            else
            {
                Common.SqlBase SB = new Common.SqlBase();
                DT = SB.Query_Table("SELECT TOP 1000  * FROM dbo.RMA_V_ARTICLE");
                <span style="color:#ff6666;">SqlCacheDependency productsTableDependency = new SqlCacheDependency("RMA_DWH", "RMA_R_ARTICLE_LOCAL_ATTR");
                Cache.Insert("ARTICLE", DT, productsTableDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);</span>
                b = true;
            }
            TS = (DateTime.Now - time).TotalSeconds.ToString();
            if (!b)//使用快取
            {
                labState.Text = "使用快取 " + TS + " s    " + DateTime.Now;
            }else
            {
                labState.Text = "未使用快取 " + TS + " s    " + DateTime.Now;
            }
            ProductsDeclarative.DataSource = DT;
            ProductsDeclarative.DataBind();
            
        }

另外如果在非web層要使用cache,可以使用:HttpRuntime.Cache,多個表關聯可以使用:

AggregateCacheDependency

部分程式碼如下:

Model.User userModel = new Com.AdiRMA.Model.User();
            string key = string.Format("{0}_{1}", "GetUserByUserID", user_id);
            if ((Model.User)<span style="color:#ff0000;">HttpRuntime.Cache</span>[key] != null)
            {
                userModel = (Model.User)<span style="color:#ff0000;">HttpRuntime.Cache</span>[key];
            }
            else
            {
                
                <span style="color:#ff0000;">AggregateCacheDependency Dependency = new AggregateCacheDependency();
                SqlCacheDependency[] dependencies = {
                                                                        new SqlCacheDependency("RMA_DWH", "RMA_S_USER"),
                                                                        new SqlCacheDependency("RMA_DWH", "RMA_S_DEPART"),
                                                                        new SqlCacheDependency("RMA_DWH", "RMA_S_USER_DEPART")
                            };
                Dependency.Add(dependencies);
                HttpRuntime.Cache.Insert(key, userModel, Dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);</span>
            }



ASP.NET的快取依賴機制-SQL快取依賴篇
http://blog.itpub.net/12639172/viewspace-618184/
使用 SQL 快取依賴項
http://msdn.microsoft.com/zh-cn/dd263032
http://msdn.microsoft.com/zh-cn/dd263037


aspnet_regsql.exe -S server -U user -P password -d database -ed
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -ed 




aspnet_regsql.exe -S <i>server</i> -U <i>user</i> -P <i>password</i> -d <i>database</i> -t <i>tableName</i> -et 
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_ARTICLE_LOCAL_ATTR -et
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_PURCHACE_ATTR -et
  
SqlDependency和SqlCacheDependency快取的用法及具體步驟
http://www.webkaka.com/tutorial/asp.net/2012/111912/


如何在ASP.NET呼叫Global.asax檔案
http://www.veryhuo.com/a/view/9402.html

關於更多命令可以參考:
http://www.cnblogs.com/ltp/archive/2009/06/30/1514331.html
取消資料庫快取依賴:
aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -dd

相關推薦

使用 SQL 快取依賴資料庫快取依賴 例項

使用 SQL 快取依賴項 最簡單的快取策略就是使快取資料在一個指定的時間週期後過期。但是這個簡單的方法意味著快取資料沒有保持與底層資料來源的聯絡,從而導致過期資料長時儲存或當前資料很快過期。更好的方法是使用 SqlCacheDependency 類,這樣資料一直被快取,直

樹狀陣列的建立修改求和程式碼展示例題

樹狀陣列是一個查詢和修改複雜度都為log(n)的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改一個元素的值;經過簡單修改可以在log(n)的複雜度下進行範圍修改,但是這時只能查詢其中一個元素的值(如果加入多個輔助陣列則可以實現區間修改與區間查詢)。(以上來

吳恩達機器學習課程:完全用Python完成可以的!程式碼

  新智元報道 來源:Reddit、GitHub編輯:肖琴【導讀】完全用Python完成吳恩達的

未能加載文件或程序集“ .....WebUI ”或它的某一個依賴試圖加載格式不正確的程序

.... access oracle 格式不正確 dll png nbsp 程序 生成 編譯Web網站沒有問題(需要引用oracle.dataAccess.dll),在運行時報錯如下: 解決: 1. 將項目編譯生成x86模式(win7 64位)

未能載入檔案或程式集“DAL”或其他的某一個依賴系統找不到指定的檔案

    針對這個問題我在敲VB.NET機房收費系統的時候總共出現了兩次,第一次是在使用反射+抽象工廠的時候出現的,第二次是在使用VS2012自帶的打包工具生成可執行檔案執行exe檔案的時候出現的。具

網站架構--WSGIGunicornNginx資料庫快取

python的web框架比如Flask,Django自帶的伺服器的目的是用於開發的,那麼在生產環境下我們使用什麼樣的伺服器呢? WSGI協議: web框架和web伺服器之間需要進行通訊,WSGI規定了一種在web伺服器與web應用程式/框架之間推薦的標準介面。 WSGI容器:

設定解決方案的專案依賴調整生成順序

在編譯C#解決方案的時候,有時生成可以,但重新生成就不行。原因是這個解決方案裡的專案之間,有的存在依賴關係。比如專案A依賴於專案B,但如果在重新生成過程中,專案A先於B編譯,因為B還沒生成,就失敗了。 遇到這種情況,固然可以一個個專案編譯嗎,但太笨太繁瑣。

對於“Newtonsoft.Json”已擁有為“NETStander.Library”定義的依賴解決辦法

問題描述: 在使用visual studio中的NuGet包管理下載程式時,有時會出現-對於“Newtonsoft.Json”已擁有為“NETStander.Library”定義的依賴項,這樣的錯誤。 這是由於NuGet的版本低造成的,解決這類問題的辦法就是更新NuGet

ROS 中文教程目錄最好不要過度依賴這種建議養成看英文原版習慣

About | Support | Discussion Forum | Service Status | Q&A answers.ros.org Search: c

vs 外部依賴 附加依賴以及如何新增依賴專案

我們在 VS 中建立 Win32 控制檯應用程式,vs 會為解決方案建立預設地建立 4 個 filters(資源管理器中沒有對應的目錄和資料夾): 標頭檔案:一般為 .h 檔案 外部依賴項 原始檔:一般為 .cpp檔案 資原始檔 1. 外部依賴項 & 資原

Glide 快取工具例子快取大小獲取磁碟快取清除(2 種方法)記憶體快取清除

Glide 快取 Simple快取路徑的指定快取大小的獲取磁碟快取清除(兩種方法)記憶體快取清除可 clone 之後檢視使用 SimpleGlide cache Simple.The cache path specifiedThe cache sizeThe disk cache (two ways)Memo

充分利用CPU快取記憶體提高程式效率原理篇

提高程式效率應該充分利用CPU的快取記憶體。要想編寫出對CPU快取友好的程式就得先明白CPU快取記憶體的執行機制。  i5-2400S:       1、有三級快取分別為 32k(資料、指令快取分開,分為32k),256K,6144K(四個CPU之間共享);  

mysql資料庫匯入SQL檔案出現亂碼如何解決?經驗總結、實測有效

使用SQLyog工具匯出MySQL資料時,當資料量大時,匯出不會錯誤,但匯入時會出現錯誤,比如mysql資料庫匯入SQL檔案時出現亂碼。 使用命令列匯入被匯出的資料時會出現如下這類的錯誤: ERROR 1064 (42000) at line 1: You have an

重灌系統後重新安裝ORACLE加環境變數配置、客戶端PL/SQL的安裝過程及注意事項避免再次踩坑

(1)首先了解什麼是OERACLE及Oracle與PL/SQL是什麼關係: ORACLE是資料庫,有客戶端和伺服器; PLSQL Developer只是第三方工具,服務於ORACLE,類似的工具還有Toad,sqlplus,sql developer等等; 安裝PLSQL Developer

學習致用——使用PL/SQL提取Oracle資料庫上下文資訊使用者環境 (Extraction of Oracle context/User environment)

學了這麼久PL/SQL,是時候用一用了。 第一個任務:批量輸出Oracle資料庫上下文資訊(使用者環境) 程式碼: DECLARE TERMINAL VARCHAR2 (50); LANGUAG VARCHAR2 (5

SQL Server 非聚集索引的覆蓋連線交叉和過濾 第二篇

在SQL Server中,非聚集索引其實可以看做是一個含有聚集索引的表,但相對實際的表來說,非聚集索引中所儲存的表的列數要少得多,一般就是索引列,聚集鍵(或RID)。非聚集索引僅僅包含源表中的非聚集索引的列和指向實際物理表的指標。 一、非聚集索引之INCLUDE   非聚集索引其實可以看做一

高併發、低延遲之C#玩轉CPU快取記憶體示例

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware an

.NET高效能程式設計之C#玩轉CPU快取記憶體示例

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware a

使用poi實現Excel匯入功能資料庫基於oracle

上次我們說了匯入的service以及controller,jsp的一些程式碼的實現,這回趁著有時間,把最後的匯入Util類實現給大家。 1、util類:ReadExcel.java public class ReadExcel { //總行