台灣最具影響力的-資訊專家社群 - 讓您成為最有價值的IT專業人才
線上人數
2005
 
會員總數:197934
接案會員:6196
文章總數:2320
討論主題:151331
歡迎您免費加入會員
討論區列表 >> ASP.NET >> Cache 的 CacheDependency 疑問

[變換順序]
[我要回覆]
1


回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Cache 的 CacheDependency 疑問
價值 : 30 QP  點閱數:1811 回應數:6

點圖分享到Plurk吧!
樓主

ERIC
初學者
45 121
1474 241
查找了小舖裡關於 Cache 的文章後,發現該主題並沒有很多,而且 CacheDependency 功能也說的不是很完全,小弟我這一個問題實在想不到好方法解決,希望有此經驗的前輩好手們幫個小忙。先貼出程式碼:

以上程式會遇到一個問題,當 Cache 一直維持有效的狀態而遠端資料庫中的資料有所改變(新增/刪除)時,除非手動的去改變 checkChange.txt 的文件理的內容(比如:隨便打幾個字進去,這時 Cache 才會重新 Load 資料庫的資料),否則的話網頁上所顯示的 DB 資料還是舊的。 有什麼方法可以在 Cache 維持有效的狀態下,然後自動偵測資料庫中的資料以被改變了?
本篇文章發表於2008-04-02 08:21
VP、EP、QP、HP該如何使用? 2010年藍色小舖認證專家風雲榜完全名單
1樓
不錯的參考

sko
初學者
210 12
512 72
檢舉此回應
Trigger 應該可以作到你要的功能吧 ~


本篇文章回覆於2008-04-03 11:02
2樓
不錯的參考

puma 版主
初級顧問
18403 0
3897 1264

捐贈 VP 給 puma 檢舉此回應
你試試在新增資料到資料庫時..順便把cache刪除

Cache.Remove("StockInfo")

這樣你在讀取時又會回到Cache("StockInfo") Is Nothing


本篇文章回覆於2008-04-03 11:33
Blog:F6 Team
http://www.dotblogs.com.tw/puma/
3樓
不錯的參考

效能狂
中級專家
3963 93
2765 822
檢舉此回應
ASP.NET 2.0 的 DataSource 快取與 SqlCacheDependency :
http://blog.xuite.net/j2ee/coder/14521566

SqlCacheDependency (快取相依性),可用來監聽 SQL Server 資料庫,當有任何資料表被修改時,能夠自動移除儲存在伺服器記憶體中的快取,而且還能將修改後的新內容,再重新加入快取中,但此功能「預設」僅限於微軟的 SQL Server 資料庫,包括 7.0、2000、2005 版本皆可套用。


SqlCacheDependency (快取相依性) 功能,在前陣子有一本中譯本「ASP.NET 2.0 網站個人化與自訂控制項」的第 20 章有介紹,該書譯自「Professional ASP.NET 2.0」的後半本:
http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789861813004&sid=39883

第 20 章一開始提到 CacheDependency 類別。您可利用該類別的 instance,把 ASP.NET 網頁中存在快取裡的項目 (例如:DataSet),和一或多個實體檔案 (如:XML 檔案) 建立關聯 (利用該類別 constructor 的參數,傳入字串陣列建立多個關聯)。當任一目錄中的任一 XML 檔案被修改或刪除時,則 DataSet 也會一併從伺服器記憶體裡的快取被刪除掉。此外,藉由 CacheDependency 類別 overloading 的 constructor,您亦可自行傳入 DateTime 當作參數,去和實體檔案的最後修改時間做比對,以讓系統決定是否要從快取中移除 DataSet 等項目。
ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref12/html/T_System_Web_Caching_CacheDependency.htm
ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref12/html/O_T_System_Web_Caching_CacheDependency_.ctor.htm

該章接下來還提到 AggregateCacheDependency 類別。該類別類似於 CacheDependency 類別,亦可將 ASP.NET 網頁中存在快取裡的項目 (例如:DataSet),和一或多個來源建立相依性,但主要是用在不同種類的來源,例如來源可同時包含實體的 XML 檔案,以及資料庫中的資料表:
ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref12/html/T_System_Web_Caching_AggregateCacheDependency.htm

此外,ASP.NET 2.0 的快取,最大的改變在於 CacheDependency 類別已經被重新改寫,您可讓自己寫的類別去繼承它,自行改寫以加強其快取相依性的功能 (關於該書中提到的這點,似乎 MSDN 也未特別提到)。藉由您自行改寫,可達成以下功能:
• 從 Active Directory 中的要求,讓快取失效 (快取被自動刪除)
• 從 MSMQ 或 MQSeries 中的要求,讓快取失效
• 從 Web Service 中的要求,讓快取失效
• 建立用於 Oracle 的 CacheDependency
• 其他需求


書中還提到,若要在 SQL Server 中啟用 SqlCacheDependency (快取相依性) 功能,必須另行用 aspnet_regsql.exe 工具,手動輸入指令 (搭配相關參數),設定讓某個資料庫中的一或多個資料表,啟用對他們的「快取失效」功能,監聽這些資料表中的內容是否曾經改變。只要執行過該指令,該資料庫中會產生一個新的 AspNet_SqlCacheTablesForChangeNotification 資料表,裡面的每筆記錄都代表您要監聽的某一個資料表;其中有一個 changeId 欄位,其值即供系統決定,使用者對頁面中的請求,是要由伺服器記憶體中目前的快取提供,抑或要至資料庫重新做查詢,如下圖 1 所示:



本篇文章回覆於2008-04-03 13:04
4樓
回應

sko
初學者
210 12
512 72
檢舉此回應
#2的方式不錯,簡單又可以達到目的.


本篇文章回覆於2008-04-03 13:20
5樓
作者回應

ERIC
初學者
45 121
1474 241
檢舉此回應
非常感謝你們三位的指教,puma 的方法確實是可行的!不過我想可能是我表達得不清楚所以產生一些誤解,我的想法是不應該讓網頁使用者來 renew Cache,而是當今天公司要在資料庫中(不透過網路,是直接在主機上)加入一個新產品,這時候當 Cache 察覺到資料庫中的資料被更動了,而自行 renew Cache。因此我程式第七行加入了一個文件 checkChange.txt,如果此一文件的內容被更動了就要 remove 現有的 Cache 然後從新載入一個新的 Cache,只不過每次公司只要新增或是刪除一個產品,就得手動去更動 checkChange.txt 文件,這樣實在太麻煩了,所以當公司資料庫有所更動時要怎麼去自動更動 checkChange.txt 文件檔呢?

對了!小弟我常去拜訪「效能狂」兄的網站,裡面有許多不錯的文章喔!


本篇文章回覆於2008-04-29 20:27
6樓
最有價值解答

longer
高級專家
8097 23
5122 1943
捐贈 VP 給 longer 檢舉此回應
你的問題應該不是出在CacheDependency,而是你的遠端資料庫(A)更新時,無法更新本機(B)的checkChange.txt。
我會建議你哪一部主機(C)去更新遠端資料庫時,順便寫一個文字檔checkChange.txt在該主機(C),
然後B主機藏個IFrame不斷Reload,用WebRequest去讀checkChange.txt。


本篇文章回覆於2008-04-29 21:04
[變換順序]
1
 

回覆
如要回應,請先登入.