| 類 | 命名空間 | 作用 |
|---|---|---|
| AggregateCacheDependency | System.Web.Caching | 組合多個依賴項,任一變更即觸發失效 |
| SqlCacheDependency | System.Web.Caching | 建立緩存項與 SQL Server 表/查詢的關聯 |
private AggregateCacheDependency CreateTableDependency()
{
AggregateCacheDependency dependency = new AggregateCacheDependency();
// 關聯數據庫 "MyDatabase" 中的 "Products" 表
dependency.Add(new SqlCacheDependency("MyDatabase", "Products"));
return dependency;
}
| 參數 | 作用 | 示例 |
|---|---|---|
| -S | 服務器名/IP | -S localhost |
| -E | Windows 集成認證 | -E |
| -U/-P | SQL 認證用戶/密碼 | -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;
}
}
無需 aspnet_regsql,基於 Service Broker 推送通知:
| 現象 | 原因 | 解決 |
|---|---|---|
| 緩存從不失效 | aspnet_regsql 未正確配置表 | 運行 -lt 驗證,檢查觸發器是否創建 |
| 緩存頻繁失效 | pollTime 過小 / 表頻繁寫入 | 增大 pollTime、拆分熱點表 |
| 異常:數據庫不支持 | SQL 版本過低 / 未啟用 Broker | 升級 SQL / 運行 ALTER DATABASE ENABLE_BROKER |
| 權限錯誤 | 應用池身份缺少權限 | GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [AppPoolIdentity] |
SqlCacheDependency 緊耦合 SQL Server,現代微服務架構建議:
理解 SqlCacheDependency 原理與配置,是掌握 .NET 緩存體系的重要基石,但技術選型需隨架構演進。