前兩章採 Reactive Loading (被動載入):請求時檢查快取,無則查資料庫。缺點:首次請求或快取過期時延遲高。Proactive Loading (主動載入) 在 Application_Start 預先載入靜態/高成本資料,消除首次請求延遲。
void Application_Start(object sender, EventArgs e)
{
// 1. 註冊路由等既有邏輯
RegisterRoutes(RouteTable.Routes);
// 2. 主動載入靜態資料
LoadStaticLookupData();
}
private void LoadStaticLookupData()
{
// 載入語言代碼表
var languages = LanguagesBLL.GetLanguages(); // 從資料庫查詢
HttpRuntime.Cache.Insert("Languages", languages, null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, null);
// 可繼續載入其他查找表:Countries, Currencies, TaxRates...
}
<asp:DropDownList ID="ddlLanguage" runat="server"
DataSource="<%# GetLanguages() %>" DataTextField="Name" DataValueField="Code" />
public List<Language> GetLanguages()
{
return HttpRuntime.Cache["Languages"] as List<Language>;
}
| 維度 | Reactive Loading | Proactive Loading (啟動載入) |
|---|---|---|
| 首次請求延遲 | 高 (查資料庫) | 零 (已在記憶體) |
| 資料新鮮度 | 依過期時間/相依性 | 需手動重載或回收應用程式 |
| 實作複雜度 | 低 (設定屬性) | 中 (Application_Start 邏輯) |
| 適用資料 | 半動態、中等查詢成本 | 靜態、高查詢成本、全站共用 |
針對靜態查找表採用啟動主動載入,能消除首次請求延遲、降低資料庫負載。搭配 CacheItemPriority.NotRemovable 防止記憶體壓力下被移除。動態資料仍建議用 Reactive Loading + SQL Cache Dependency。