首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 啟用 SQL Server 緩存依賴:Web.config 配置、aspnet_regsql 命令行、業務層代碼模式、自定義緩存工具類完整實現

     編輯:關於SqlServer

核心原理

SqlCacheDependency:數據表無變更時讀緩存,有變更時自動失效緩存並重新查庫,適用於「讀多寫少、準實時」的基礎數據(如新聞分類、字典表、配置表)。

三步實施

步驟 1:Web.config 啟用

<system.web>
  <caching>
    <sqlCacheDependency enabled="true" pollTime="6000">  <!-- 每 6 秒輪詢一次 -->
      <databases>
        <add name="YD_JWC_JAKE" connectionStringName="cachestr" />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

<connectionStrings>
  <add name="cachestr" connectionString="Data Source=127.0.0.1;Initial Catalog=YD_JWC_JAKE;User ID=sa;Password=****;" />
</connectionStrings>
  • name:依賴名稱,業務代碼中引用
  • connectionStringName:對應 connectionStrings 中的 name
  • pollTime:輪詢間隔(毫秒),權衡實時性與負載

步驟 2:命令行啟用數據庫/表級依賴

cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
aspnet_regsql -C "Data Source=127.0.0.1;Initial Catalog=YD_JWC_JAKE;User ID=sa;Password=****" -ed -et -t "T_NewsClass"
  • -C:連接字串(大寫 C)
  • -ed:啟用數據庫級依賴(創建 AspNet_SqlCacheTablesForChangeNotification 表、觸發器、存儲過程)
  • -et:啟用表級依賴
  • -t:指定表名(多表重複執行)
  • 執行後數據庫新增:AspNet_SqlCacheTablesForChangeNotification、各表觸發器、AspNet_SqlCacheUpdateChangeIdStoredProcedure 等

步驟 3:業務層讀取模式(緩存-依賴模式)

private void GetInfoClass(int type) {
  string cacheKey = "cacheclass" + type;
  object obj = DataCache.GetCache(cacheKey);
  DataTable dt = null;

  if (obj == null) {  // 緩存未命中
    NewsClassBLL nc = new NewsClassBLL();
    dt = nc.GetList("").Tables[0];
    obj = dt;

    if (obj != null) {
      // 關鍵:創建 SqlCacheDependency 綁定表變更
      SqlCacheDependency dep = new SqlCacheDependency("YD_JWC_JAKE", "T_NewsClass");
      DataCache.SetCache(cacheKey, obj, dep);  // 存入緩存並掛載依賴
    }
  } else {
    dt = (DataTable)obj;  // 緩存命中,直接用
  }

  // 渲染輸出...
  DataRow[] rows = dt.Select("", "classid");
  StringBuilder sb = new StringBuilder("
    "); foreach (DataRow r in rows) { string cid = Security.EncryptQueryString(r["ClassId"].ToString(), ConfigHelper.GetConfigString("DecryStr")); string cdesc = r["ClassDesc"].ToString(); string url = (type==1) ? "/Info" + cid + ".shtml" : (type==2) ? "/File" + cid + ".shtml" : "/FAQ" + cid + ".shtml"; sb.AppendFormat("
  • {1}
  • ", url, cdesc); } sb.Append("
"); Response.Write(sb.ToString()); }

自定義緩存工具類

public static class DataCache {
  private static Cache Cache { get { return HttpRuntime.Cache; } }

  public static object GetCache(string key) {
    return Cache[key];
  }

  public static void SetCache(string key, object value) {
    Cache.Insert(key, value);
  }

  public static void SetCache(string key, object value, CacheDependency dependency) {
    Cache.Insert(key, value, dependency, 
      Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
      CacheItemPriority.Default, null);
  }
}

關鍵注意點

適用性判斷

  • ✅ 字典表、配置表、分類表、權限表(讀多寫少、變更頻率低)
  • ✅ 多 Web 服務器負載均衡場景(共享數據庫依賴自動同步)
  • ❌ 高頻寫入表(訂單、日誌、流水)
  • ❌ 極強實時性要求(股票報價、即時通訊)

進階:SQL Server 2005+ 查詢通知

更細粒度、基於查詢語句的通知(SqlDependency + Service Broker),無需輪詢,但配置複雜、要求 Service Broker 啟用、有諸多限制。簡單表級依賴首選 SqlCacheDependency。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目說明
輪詢間隔pollTime 不宜太小(如 <1000ms),高併發下會頻繁查 AspNet_SqlCacheTablesForChangeNotification 表
表結構變更DDL 變更(加列、改類型)會導致依賴失效需重新 aspnet_regsql -et -t
權限連接賬號需有 CREATE TABLE、CREATE PROCEDURE、CREATE TRIGGER 權限(啟用時),運行時需 SELECT 監控表
集群/鏡像故障轉移後依賴自動有效(監控表在用戶庫中)
非 ASP.NET 環境可用 System.Web.Caching.SqlCacheDependency 庫引用,但需手動輪詢