使用 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
SQL Server 2005怎才可以做到緩衝依賴?有誰懂的教教
【託管服務】使用SQL Server 2005實現資料庫緩衝依賴2011-05-23 14:14使用方法和步驟如下:
step1
檢測是否已經啟用ServiceBroker,檢測方法:
SelectDATABASEpRoPERTYEX("資料庫名稱","IsBrokerEnabled")--1表示已經啟用0表示沒有啟用
step2
如果ServiceBroker沒有啟用,使用下面語句啟用:
詳細的資料可以進入我空間瞭解~希望可以幫到你
參考資料:hi.baidu.com/...9.html
不可以串連SQL資料庫進行緩衝依賴項註冊 不可以開啟登入所的資料庫 登入失敗
我是這樣解決的:
查看資料庫 --安全性---登入名稱 ,看看有沒有“pet”這個使用者名稱,沒有則建立,角色為 public 和 sysadmin 。映射的話選你要處理的表。當然“混合模式”那裡還是要調的。然後試試pet能不能登入資料庫,可以的話就建立“資料庫緩衝依賴項”