[英]asp.net cache and recycle worker processes
所以我注意到只要工作進程被回收,就會清除HttpContext.Cache
。 我有一個回調,它會在緩存項到期時將其重新插入緩存。 但是,當該過程被回收時,似乎不會發生這種情況。
我在Application_Start
中有一個調用,它將相應的項添加到Cache中,但是在回收工作進程之后似乎沒有調用它。 是否有回調我可以用來在回收時重新填充緩存,或者它應該是Application_Start
? 另外,我如何在本地測試?
我很確定我在這里做錯了什么。
工作流程回收可以看作停止並啟動持有.Net的流程。 所有AppDomain數據都將丟失。
根據我的理解,Application_Start僅在第一個請求到達時執行。 我希望即使在回收后,行為也是一樣的。
但如果它沒有執行(有趣),那么你總是可以在其他地方觸發它。 有很多方法可以做到這一點。 例如Application_BeginRequest或在第一次加載期間引用的任何靜態類的ctor。
注意,HttpContext.Cache實際上只是一個靜態對象,所以你可以簡單地得到一個static bool isInitialized = false;
一旦init完成就會更改,並且它將保留在請求之間。 使用良好的lock() {}
它應該運行順暢(因此兩個請求不會啟動兩次初始化)。
我通常解決的方法是按需緩存。 不適合所有解決方案。 我還使用Enterprise Framework或AppFabric為緩存設置超時(TTL)。
當AppDomain被回收時,所有程序集都被卸載,因此所有數據都被清除。 當應用程序重新啟動時,它本質上就像從頭開始,沒有辦法(據我所知)以這種方式重新填充緩存。
這與停止和啟動應用程序不同,后者基本上保存了應用程序的狀態,並在重新啟動時恢復了之前的狀態(包括緩存)。
我唯一能想到的就是禁用應用程序回收,但不建議這樣做,因為你最終會遇到不斷增加的緩存大小,這將成為一個瓶頸。 您可以將數據持久保存到不同的緩存機制,例如SQL數據庫。
CacheItemPriority枚舉具有“NotRemovable”選項,可防止在垃圾回收期間從緩存中刪除該項。
來自MSDN:
當服務器釋放系統內存時,具有此優先級的緩存項不會自動從緩存中刪除。 但是,具有此優先級的項目將根據項目的絕對或滑動到期時間與其他項目一起刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.