Asp.net
“預熱” ASP.NET 記憶體的策略
我有一個 ASP.NET MVC 3 / .NET Web 應用程序,它是大量數據驅動的,主要圍繞“位置”(紐約、加利福尼亞等)的概念。
無論如何,我們有一些非常繁忙的數據庫查詢,它們在完成後會被記憶體。
例如:
public ICollection<Location> FindXForX(string x) { var result = _cache.Get(x.ToKey()) as Locaiton; // try cache if (result == null) { result = _repo.Get(x.ToKey()); // call db _cache.Add(x.ToKey(), result); // add to cache } return result; }但我不想讓倒霉的第一個使用者等待這個數據庫呼叫。
數據庫呼叫可能需要 40-60 秒,遠遠超過 ASP.NET 請求的預設超時時間。
我想在我的應用程序啟動時或之後不久為某些“流行”位置(例如紐約,加利福尼亞)“預熱”這些呼叫。
我不想簡單地在Global asax (Application_Start) 中執行此操作,因為該應用程序需要很長時間才能啟動。(我計劃預先記憶體大約 15 個位置,所以這需要幾分鐘的工作)。
有什麼辦法可以非同步觸發這個邏輯嗎?也許旁邊的服務是更好的選擇?
我能想到的唯一其他選擇是有一個管理頁面,其中包含這些操作的按鈕。因此,一旦應用程序啟動,管理員(例如我)就可以觸發這些查詢。那將是最簡單的解決方案。
有什麼建議嗎?
快速而骯髒的方法是
Task從Application_Start但是我發現將這個功能封裝到一些基礎設施中是很好的,這樣您就可以創建一個 ~/Admin/CacheInfo 頁面來讓您監控可能在載入過程中的進度、狀態和異常記憶體。
查看IIS 7.5 的“始終執行”應用程序設置。這基本上要做的是在現有應用程序池要回收時準備好一個應用程序池。當然,第一次需要 40-60 秒,但之後事情會很快,除非你重新啟動機器。