ASP.NET 2.0 引入了多項效能優化特性,其中快取技術無疑是最關鍵的一環。透過將常用資料暫存於記憶體(或硬碟),系統能大幅降低資料庫存取頻率,進而提升應用程式的回應速度與延展性。本文將系統性地介紹 ASP.NET 2.0 的三大快取層面:頁面輸出快取、資料來源快取,以及結合 SQL Server 2005 的 SQL 快取相依性。
頁面輸出快取可將整個頁面或部分片段的輸出 HTML 直接存入快取,後續請求無需重新執行頁面生命週期即可回應。
在 .aspx 頁面頂端加入 <%@ OutputCache Duration="60" VaryByParam="none" %> 即可啟用。屬性說明如下:
none。若頁面大部分靜態,僅少數區塊(如即時時間、使用者名稱)需動態更新,可使用 <asp:Substitution> 控制項搭配靜態方法:
<script runat="server">
public static string GetCurrentDate(HttpContext context)
{
return DateTime.Now.ToString();
}
</script>
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDate" />
此機制會在輸出快取的 HTML 中保留佔位符,於每次回應時呼叫指定方法填入最新內容。
SqlDataSource、ObjectDataSource 等資料來源控制項內建快取屬性,無需撰寫程式碼即可快取查詢結果。
| 屬性 | 說明 |
|---|---|
| EnableCaching | 啟用快取(預設 false) |
| CacheDuration | 快存秒數,預設 Infinite(永久) |
| CacheExpirationPolicy | Absolute(到期失效)或 Sliding(滑動過期,每次存取重設計時器) |
| SqlCacheDependency | 指定資料表相依性,如 pubs:authors |
| CacheKeyDependency | 自訂快取金鑰相依性(支援 SQL Server 2005) |
當快取資料量龐大導致記憶體壓力時,可啟用硬碟快取:
DiskCacheable="true"。Web.config 中設定 <diskCache enabled="true" maxSizePerApp="2" />(單位 MB)。注意:硬碟 I/O 較慢,適用於快存時間較長(如 1 小時以上)的情境。
傳統快取最大痛點在於「資料異動後快取未同步更新」。ASP.NET 2.0 配合 SQL Server 2005/2008 引入 SqlCacheDependency,利用 Service Broker 與查詢通知機制,資料表一旦異動即自動使快取失效。
aspnet_regsql.exe -S ".\DBNAME" -E -d "pubs" -ed
aspnet_regsql.exe -S ".\DBNAME" -E -d "pubs" -et -t "authors"
Web.config 註冊連線字串與輪詢時間(若使用舊版輪詢模式):
<sqlCacheDependency enabled="true" pollTime="1000">
<databases>
<add name="PubsDB" connectionStringName="pubsConnectionString" />
</databases>
</sqlCacheDependency>
SqlDependency="pubs.authors" 或 <%@ OutputCache SqlDependency="pubs.authors" %>。需執行 aspnet_regsql.exe 建立輪詢資料表與觸發器,設定較繁瑣但原理相同。Oracle 等非 SQL Server 資料庫則不支援此功能。
在 Web.config 定義快取設定檔,供多頁面重複使用:
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheFor60Seconds" duration="60" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
頁面引用:<%@ OutputCache CacheProfile="CacheFor60Seconds" %>。
ASP.NET Applications\Cache Total Hit Ratio),依實際流量調整 Duration。掌握上述機制,即能在 ASP.NET 2.0 應用中建立高效能、可維護的快取架構。