使用 SqlDependency 訂閱查詢通知必須向SQL Server Service Broker提供製定規則的查詢語句,一般來講,必須是簡單的sql查詢語句(不能用*,不能用top,不能用函數,包括彙總函式,不能用子查詢,包括where後的子查詢,不能用外串連,自串連,不能用暫存資料表,不能用變數,不能用視圖,不能垮庫,表名之前必須加類似dbo資料庫擁有者這樣的首碼),
例如:select * from table1,select column1 from table1,select count(*) from table1 都是錯誤的sql查詢語句,select column1 from dbo.table1 則是正確的語句。
使用步驟
一 為資料庫開啟SqlCacheDependency功能
方法1:使用aspnet_regsql命令列或SqlCacheDependencyAdmin來配置串連資料庫。
aspnet_regsql -S SQL伺服器名 -E -d 資料庫 -ed 啟動資料庫的資料緩衝依賴功能
我們還需要對相關的資料表執行aspnet_regsql命令,如:
aspnet_regsql -S SQL伺服器名 -E -d 資料庫 -t 表名 -et 多個表就多次執行這句話
方法2:
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //啟動資料庫的資料緩衝依賴功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //啟用資料表緩衝
推薦這段代碼寫在Global.asax的Application_Start方法中,以便應用程式啟動的時候就啟用資料庫和資料表的緩衝依賴功能。
二 配置Web.config
<!--緩衝配置-->
<caching>
<!--pollTime為查詢資料庫是否變動的間隔時間,毫秒單位-->
<sqlCacheDependency enabled="true" pollTime="10000">
<databases>
<add name="資料庫名" connectionStringName="Webconfig的連接字串key" pollTime="10000"/>
</databases>
</sqlCacheDependency>
</caching>
三 編碼實現
快取作業類:
/// <summary>
/// 擷取所有相關配置並對應添加CacheDependency對象
/// </summary>
/// <param name="configKey">指定需要使用Cache的資料庫表名的Webconfig's key</param>
/// <returns></returns>
public static AggregateCacheDependency GetDepandency(string configKey)
{
AggregateCacheDependency dependency = new AggregateCacheDependency();
string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
string tableConfig = ConfigurationManager.AppSettings[configKey];
string[] tables = tableConfig.Split(',');
foreach (string tableName in tables)
dependency.Add(new SqlCacheDependency(dbName, tableName));
return dependency;
}
緩衝業務類:
/// <summary>
/// 友情連結SqlCacheDependency類
/// </summary>
public class LinksProxy
{
/// <summary>
/// 設定緩衝期間
/// </summary>
private static readonly int CacheTimeout = int.Parse(ConfigurationManager.AppSettings["LinksCacheDuration"]);
/// <summary>
/// 是否開啟緩衝
/// </summary>
private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
/// <summary>
/// 擷取全部友情連結
/// </summary>
public static IList<LinksInfo> GetLinks()
{
//如果不開啟緩衝則直接調用DAL方法執行常規操作
if (!enableCaching)
return LinksDAL.SelectLinks();
else //開啟緩衝
{
//設定緩衝key,這個最好根據查詢條件來設定,這樣可以緩衝同一條件的資料
string key = "Links_by_search_all";
//讀取緩衝中的資料
IList<LinksInfo> data = (IList<LinksInfo>)HttpRuntime.Cache[key];
if (data == null)//如果緩衝沒有讀到資料
{
//訪問DAL從資料庫讀取資料並加入緩衝,最後返回
data = LinksDAL.SelectLinks();
AggregateCacheDependency acd = TableCacheDependency.GetDepandency("LinksTableDependency");
HttpRuntime.Cache.Add(key, data, acd,DateTime.Now.AddMinutes(CacheTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return data;
}
}
}