zoukankan      html  css  js  c++  java
  • EF优化之启动预热

    为什么Entity Framework的初始化速度慢如蜗牛呢?

    对于在应用程序中定义的每个DbContext类型,在首次使用时,Entity Framework都会根据数据库中的信息在内存生成一个映射视图(mapping views),而这个操作非常耗时。

    在第1次调用DbContext进行数据库操作时会进行缓慢的mapping views生成操作,后续的DbContext操作会共享已经生成的mapping views,不受这个问题影响。但是要注意的是你定义的每一个DbContext都会面临这个问题。

    而我们的缓解之道则是在应用程序初始化时一次性触发所有的DbContext进行mapping views的生成操作——调用StorageMappingItemCollection的GenerateViews()方法。

     一、预生成映射视图

    将代码放在Application_Start中调用PreApplicationStartMethod中执行

     private void PreApplicationStartMethod()
            {
                using (var dbcontext = new XXXDBContext())
                {
                    var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
                    var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>());
                }  //对程序中定义的所有DbContext逐一进行这个操作
            }

    在程序更新时只需发一个请求让程序启动起来,比如访问首页,就可以直接发布。而第1位用户,等待时间由原来7秒减少到0.5-0.6秒。

     二、禁用第一次ef查询对表__MigrationHistory的问题

    使用了ef的Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行。

    通过监测会先执行下面的sql:

    SELECT
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT
    COUNT(1) AS [A1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
    ) AS [GroupBy1]
    GO
    SELECT TOP (1)
    [Extent1].[Id] AS [Id],
    [Extent1].[ModelHash] AS [ModelHash]
    FROM [dbo].[EdmMetadata] AS [Extent1]
    ORDER BY [Extent1].[Id] DESC
    GO

    这段sql语句其实中只是在开发的时候有用,发布到生产环境,可以把这个给禁用了以提高性能。

    解决办法:Application_Start加代码

     protected void Application_Start()
            { 
                 //.......
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                 
    #if DEBUG
                BundleTable.EnableOptimizations = false;//关闭文件压缩功能
    #else
                BundleTable.EnableOptimizations = true;//开启文件压缩功能
                Database.SetInitializer<MMISDBContext>(null);
    #endif
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                PreApplicationStartMethod();
            }

    MMISDBContext这是我项目的EF上下方类,你要根据你的项目替换成自己的EF上下方类。

    三、安装Application Initialization

    这是在iis8出来后才有的,iis8内置的功能,一些是iis10的配置图

    而对于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。

    设置应用程序池如下图:

    设置网站如下图

    配置好后,测试了下,效果十分不错。 回收程序池后首次打开各站点,延迟都很低。 其实这个模块的思路和定时从外部触发一个访问是一样的,只是,更好的地方在于,它本身在程序池回收重启的时候就完成了这件事,而不会让外部访问有机会遇到首次访问的情况。

    四、用Ngen安装生成EF的本地镜像

    1、打开cmd窗口
    2、定位到dll所在的目录,如:cd d:website1in,切换到程序的bin目录。
    3、运行ngen命令
    For 32 bit run:
    %WINDIR%Microsoft.NETFrameworkv4.0.30319
    gen install EntityFramework.SqlServer.dll
    For 64 bit run:
    %WINDIR%Microsoft.NETFramework64v4.0.30319
    gen install EntityFramework.SqlServer.dll

      注意:这里根据你自己机器(是32还是64)和.net版本,选择相应的命令,只需要安装EntityFramework.SqlServer.dll,因为安依赖EntityFramework.dll,会自动安装生成EntityFramework.dll的本地镜像。

     4.查看是否在本机映像缓存中,也列出了依赖子的相关类库
    %WINDIR%Microsoft.NETFramework64v4.0.30319
    gen display EntityFramework

    文档:https://docs.microsoft.com/zh-cn/dotnet/framework/tools/ngen-exe-native-image-generator

    五、IIS闲置超时导致变冷

    如果你觉得这还没有解决”过了一段时间不访问页面然后再次打开页面变慢“的问题,而且不能忍受第一次访问还是有点慢,可以设置应用程序池的”闲时超时“和回收”固定时间间隔“长一些或者建一个计划任务定时去访问使用了ef的页面,这样给ef热身,让ef不变冷,这样可以防止长时间不请求网站,应用程序进程停止再次访问变慢的问题。设置应用程序池的时间如下图:

    闲时超时默认是20分钟,如果在超过20分钟都没有请求这个应用程序池工作进程就要关闭。这里你可以设置根据自己需要设置长一些。

    六、Model和DAl单独的分层的

    用vs建一个mvc项目,Model、DAL、Controller、View都在Web项目里面。为了减少model和DAL导致重新编译dll带来的性能影响。我把Model和DAL都单独的分层,编译成单独的dll了。
    这一点,我比较不理解,路过的高手请指点下
     

    原文:

    https://blog.csdn.net/qq61714079/article/details/50540318

    https://msdn.microsoft.com/en-us/data/dn469601#code

    https://msdn.microsoft.com/zh-cn/library/dn292691(v=vs.113).aspx

    https://www.cnblogs.com/sunShineJing/p/5083184.html

  • 相关阅读:
    C# 解析json
    Java环境配置
    Wpf学习(五) 数据绑定Binding【小达原创】
    WPF学习(四) 样式 【小达原创】
    jQuery-- 格式化时间
    leetcode -- Nim Game
    Git 学习笔记--拉取远程分支到本地
    Git 学习笔记--删除错误提交的commit
    iOS开发-- 开发中遇到的问题汇总
    Javascript--数组转换成字符串
  • 原文地址:https://www.cnblogs.com/xcsn/p/9261898.html
Copyright © 2011-2022 走看看