• 关于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:WINDOWSMicrosoft.NETFrameworkv2.0.50727。因为Ngen.exe存放在这里,如果不定位,Ngen.exe无法正确定执行。

    cd C:WINDOWSMicrosoft.NETFrameworkv2.0.50727

    2)生成本机本机映像。

    ngen install D:SystemToolManagerNote.dll   (备注:Dll方式)

     ngen install D:SystemToolManagerNote.exe  (备注:exe方式)

    3)卸载本机本机映像,请使用与安装时相同的命令行选项。

    ngen uninstall D:SystemToolManagerNote.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分钟都没有请求这个应用程序池工作进程就要关闭。这里你可以设置根据自己需要设置长一些。

  • 相关阅读:
    【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛
    【codeforces666E】Forensic Examination 广义后缀自动机+树上倍增+线段树合并
    【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
    【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理
    窗体的呈现、用户控件的呈现
    WPF和js交互 WebBrowser数据交互
    字符串string 转换为 Base64String
    静态资源加载过程及时序
    if else 与 if else if 的区分与使用总结
    复杂耗时逻辑处理——子线程
  • 原文地址:https://www.cnblogs.com/lkd3063601/p/4713637.html
Copyright © 2020-2023  润新知