返回“ASP.NET 2.0數據教程目錄”
導言:
在58和59章探討的緩存技術使用的是基於時間的緩存周期,當 過了某段時間後便將緩存數據從內存清除。當設置緩存時間為x秒時,數據在x秒 內都是“新”的。當然,就像在60章談到的那樣,對靜態數據來說,x 可延伸到web應用程序的整個生命周期(lifetime)。
當緩存數據時,基於 時間周期的技術因為其易用性而常常被采用,不過又常常不那麼完美。理想的狀 態是這樣的:數據庫數據還是應緩存在內存,直到源數據(underlying data)發生 改變時才從內存清除。這樣的話可以最大化的獲取緩存帶來的性能上的好處,同 時使“過時數據”(stale data)持續的時間最短。然而,為此,我們 需要建立一種機制來探測數據庫數據什麼時候發生了改變,並將對應的緩存條目 清除掉。
ASP.NET 2.0提供的SqlCacheDependency class類和必要的下部 基礎構造(infrastructure)可以判斷數據庫什麼時候發生了更改,以便將對應的 緩存條目從內存清除掉。有2種技術可以判斷源數據在什麼時候發生了改變: polling 和notification。討論完這2者之間的差別後,我們將創建必要的下部基 礎構造來支持polling,然後探討如何使用SqlCacheDependency class類
理解Notification and Polling
正如前面所述,有2種方法來判斷一個數 據庫裡的數據在什麼時候修改過:notification 和 polling.當使用 notification的時候,數據庫提示(alerts)ASP.NET對應某個具體查詢的數據已經 發生了改變;於是對應的緩存條目將被清除。使用polling的時候,數據庫服務器 將包含某個表(tables)最近發生更改時的相關信息。ASP.NET周期性的對數據庫進 行檢查,看哪些表在數據被緩存以後發生過改動,若改動過,對應的緩存條目將 被清除。
notification是對查詢(query)而不是表(table)進行跟蹤檢查, 相對polling而言,需要采取的步驟要少些。不過遺憾的是,只有在Microsoft SQL Server 2005的完整版(也就是non-Express版本)才能使用該功能。而 Microsoft SQL Server的所有版本,從7.0 到2005都可以使用polling功能,因為 本系列教程使用的是SQL Server 2005的Express版本,在此我們將集中探討建立 和使用polling。關於SQL Server 2005的notification功能,你可以參閱本文結 束部分的Further Reading。
要使用polling,我們將設置數據庫包含一個 名為AspNet_SqlCacheTablesForChangeNotification的表。該表有3列: tableName, notificationCreated, 和changeId.對於哪些在web應用程序的SQL cache dependency裡要用到的表,該表都有一條記錄與之對應。tableName就是具 體某個表的名稱;notificationCreated指明了添加記錄時的date 和 time;而列 changeId的類型是int,初始值是0,每當對應的表發生一次改動,其值就自動增 加一次。
除了表AspNet_SqlCacheTablesForChangeNotification外,數據 庫還需要為出現在SQL cache dependency裡的每個表包含一個觸發器(triggers), 任何時候,只要表插入、更新、刪除一條記錄或在表 AspNet_SqlCacheTablesForChangeNotification裡的對應的changeId值增大的情 況下就會執行觸發器。
當使用SqlCacheDependency對象(object)來緩存數 據時,ASP.NET將關注某個表的當前(current)的changeId值,一旦發現當前其值與 數據庫裡面的changeId值不同時,就將該SqlCacheDependency對象清除。因為, changeId不吻合就意味著在完成數據緩存後,表又發生過改動。