關於EF第一次加載慢或過一段時間不訪問時再次訪問加載慢問題的總結


優化方案

1.安裝Application Initialization

這是在iis8出來后才有的,iis8內置的功能,而對於iis7.5也提供了一個擴展以支持這個功能。

Application Initialization Module for IIS 7.5

在頁面接近底部的地方,找到適合自己架構的安裝鏈接

  • x86 for Windows 7
  • x64 for Windows 7 or Windows Server 2008 R2

安裝這個iis模塊后,在iis界面中並沒有模塊圖標和配置界面,還需要安裝:

http://pan.baidu.com/s/1c091WxM

安裝成功之后會多了一個配置如下圖:

如果僅配置程序池StartMode為AlwaysRunning還不放心的話,
也可以同時針對站點開啟preload和DoAppInitAfterRestart。

設置應用程序池如下圖:

設置網站如下圖

配置好后,測試了下,效果十分不錯。
回收程序池后首次打開各站點,延遲都很低。
其實這個模塊的思路和定時從外部觸發一個訪問是一樣的,只是,更好的地方在於,它本身在程序池回收重啟的時候就完成了這件事,而不會讓外部訪問有機會遇到首次訪問的情況。

2.用Ngen安裝生成EF的本地鏡像

由於C#是使用實時 (JIT) 編譯器編譯原始程序集。因此第一次運行C#程序(或Dll)時,程序的啟動非常慢。為了提高用戶的體驗,可以用Microsoft的供的本機映像生成器 (Ngen.exe) 提高程序的性能。Ngen.exe 創建本機映像(包含經編譯的特定於處理器的機器代碼的文件),並將它們安裝到本地計算機上的本機映像緩存中。運行庫可從緩存中使用本機映像,而不是使用實時 (JIT) 編譯器編譯原始程序集。

 

1)在命令行中定位到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727。因為Ngen.exe存放在這里,如果不定位,Ngen.exe無法正確定執行。

cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

 

2)生成本機本機映像。

ngen install D:\SystemTool\ManagerNote.dll   (備注:Dll方式)

 ngen install D:\SystemTool\ManagerNote.exe  (備注:exe方式)

 

3)卸載本機本機映像,請使用與安裝時相同的命令行選項。

ngen uninstall D:\SystemTool\ManagerNote.dll

注意:這里根據你自己機器(是32還是64)和.net版本,選擇相應的命令,只需要安裝EntityFramework.SqlServer.dll,因為安依賴EntityFramework.dll,會自動安裝生成EntityFramework.dll的本地鏡像。

3.EF Pre-Generated Mapping Views(預生成映射視圖)

Application_Start加入下面代碼:
using (var dbcontext = new EFDbContext())
{
    var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
    var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
    mappingCollection.GenerateViews(new List<EdmSchemaError>());
    //對程序中定義的所有DbContext逐一進行這個操作
}

4.補充

如果你覺得這還沒有解決”過了一段時間不訪問頁面然后再次打開頁面變慢“的問題,而且不能忍受第一次訪問還是有點慢,可以設置應用程序池的”閑時超時“和回收”固定時間間隔“長一些或者建一個計划任務定時去訪問使用了ef的頁面,這樣給ef熱身,讓ef不變冷,這樣可以防止長時間不請求網站,應用程序進程停止再次訪問變慢的問題。設置應用程序池的時間如下圖:

閑時超時默認是20分鍾,如果在超過20分鍾都沒有請求這個應用程序池工作進程就要關閉。這里你可以設置根據自己需要設置長一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM