首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET SqlCacheDependency 緩存技術原理與配置全解析

     編輯:ASP.NET 基礎

核心類架構

類命名空間作用
AggregateCacheDependencySystem.Web.Caching組合多個依賴項,任一變更即觸發失效
SqlCacheDependencySystem.Web.Caching建立緩存項與 SQL Server 表/查詢的關聯

創建緩存依賴代碼

private AggregateCacheDependency CreateTableDependency()
{
    AggregateCacheDependency dependency = new AggregateCacheDependency();
    // 關聯數據庫 "MyDatabase" 中的 "Products" 表
    dependency.Add(new SqlCacheDependency("MyDatabase", "Products"));
    return dependency;
}

Web.config 完整配置 (輪詢模式)


  
    
  
  
  
    
      
        
          
        
      
    
    
  

配置關鍵點

  • `name="MyDatabase"` 必須與 `new SqlCacheDependency("MyDatabase", ...)` 完全一致
  • `pollTime`:輪詢間隔 (毫秒),生產環境建議 10000-60000
  • `enabled="true"`:總開關

數據庫端配置:aspnet_regsql 命令詳解

參數作用示例
-S服務器名/IP-S localhost
-EWindows 集成認證-E
-U/-PSQL 認證用戶/密碼-U sa -P 123456
-d目標數據庫-d MyDatabase
-ed啟用數據庫輪詢-ed
-dd禁用數據庫輪詢-dd
-t目標表-t Products
-et啟用表輪詢-et
-dt禁用表輪詢-dt
-lt列出已啟用輪詢的表-lt

完整配置腳本示例

# 1. 啟用數據庫級輪詢
aspnet_regsql -S localhost -E -d MyDatabase -ed

# 2. 啟用具體表輪詢
aspnet_regsql -S localhost -E -d MyDatabase -t Products -et
aspnet_regsql -S localhost -E -d MyDatabase -t Categories -et
aspnet_regsql -S localhost -E -d MyDatabase -t Orders -et

# 3. 驗證
aspnet_regsql -S localhost -E -d MyDatabase -lt

完整緩存使用流程

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string cacheKey = "ProductsCache";
        DataSet data = HttpRuntime.Cache[cacheKey] as DataSet;
        
        if (data == null)
        {
            // 1. 獲取數據
            data = GetDataSource();
            
            // 2. 創建依賴
            AggregateCacheDependency cd = CreateTableDependency();
            
            // 3. 寫入緩存:1小時絕對過期 + 依賴觸發失效
            HttpRuntime.Cache.Add(cacheKey, data, cd,
                DateTime.Now.AddHours(1), Cache.NoSlidingExpiration,
                CacheItemPriority.High, null);
        }
        
        GridView1.DataSource = data;
        GridView1.DataBind();
    }
}

private DataSet GetDataSource()
{
    string connStr = ConfigurationManager.ConnectionStrings["LocalConnString"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT TOP 50 * FROM Products", conn))
    {
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        return ds;
    }
}

SQL Server 2005+ 查詢通知模式 (現代推薦)

無需 aspnet_regsql,基於 Service Broker 推送通知:

  1. Web.config:``
  2. 代碼依賴:`new SqlCacheDependency("CommandNotification")`
  3. Global.asax:`SqlDependency.Start(connStr)` / `Stop()`
  4. 數據庫:`ALTER DATABASE MyDb SET ENABLE_BROKER`

常見問題排查

現象原因解決
緩存從不失效aspnet_regsql 未正確配置表運行 -lt 驗證,檢查觸發器是否創建
緩存頻繁失效pollTime 過小 / 表頻繁寫入增大 pollTime、拆分熱點表
異常:數據庫不支持SQL 版本過低 / 未啟用 Broker升級 SQL / 運行 ALTER DATABASE ENABLE_BROKER
權限錯誤應用池身份缺少權限GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [AppPoolIdentity]

架構演進建議

SqlCacheDependency 緊耦合 SQL Server,現代微服務架構建議:

  • 遷移至 Redis + 發布/訂閱 實現跨服務緩存失效
  • 使用 Change Data Capture (CDC) + 消息隊列異步更新緩存
  • 採用 Cache-Aside 模式 + 短 TTL 容忍最終一致性

理解 SqlCacheDependency 原理與配置,是掌握 .NET 緩存體系的重要基石,但技術選型需隨架構演進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved