EF初次加载优化

时间:2022-11-24 16:47:38

One

1开启对应网站预加载

EF初次加载优化

2、 编辑网站对应应用程序池启动模式

EF初次加载优化

EF初次加载优化

Two

安装Application Initialization、Application Initialization for UI

相关地址:https://www.iis.net/downloads/microsoft/application-initialization

https://blogs.msdn.microsoft.com/amol/2013/01/25/application-initialization-ui-for-iis-7-5/

安装成功之后出现如图所示模块:

EF初次加载优化

EF初次加载优化

EF初次加载优化

代码优化

1、禁用第一次ef查询对表__MigrationHistory的问题。使用了ef的Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行。解决办法:在DbContext初始化添加代码Database.SetInitializer<InsuranceDbContext>(null) 或在Application_Start添加。

2、EF Pre-Generated Mapping Views(预生成映射视图)

Application_Start加入下面代码:

           using (var dbcontext = new InsuranceReadOnlyDbContext())

            {

                var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;

                var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWork

space.GetItemCollection(DataSpace.CSSpace);

                mappingCollection.GenerateViews(new List<EdmSchemaError>());

            }

 

            using (var dbcontext = new InsuranceDbContext())

            {

                var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;

                var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWork

space.GetItemCollection(DataSpace.CSSpace);

                mappingCollection.GenerateViews(new List<EdmSchemaError>());

            }·

3 Ngen优化(用Ngen安装生成EF的本地镜像)

1、打开cmd窗口

2、cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

3 、定位到项目dll所在的目录,执行ngen命令,如:

ngen  E:\Source\Workspace s\KR\WebSites\Procurement\Procurement-20170816\1- Presentention\

Procurement.Op\bin\EntityFramework.dll

1.       问题原因分析

1.1.1.   EF方面的原因:

1、Code First第一次启动会对比程序中的Model与数据库表(database initializer ),生成Model与数据库的映射视图

2、随着EF的开源,EF从6开始就不会包含在.net Framework中,安装.net Framework默认是不会安装EF的。因此EF程序集就没有生成本地镜像,这样每次程序启动,EF的代码都会通过just-in-time (JIT) compiler(即时编译器)把MSIL中间代码编译成本机能识别的本地代码。因为这个生成的本地代码存在程序运行的进程里面的内存中,它将回收当程序进程被终止(例如:iis程序池回收,程序池默认是按需触发运行的,没人访问它就不启动了)。由于EF框架还是比较大的,EF6文件大小到4-5M了,所以每次启动都要重写编译本地代码有比较明显的性能影响。

 

1.1.2.   其他原因:

1、站点更新后重新加载程序文件;

2、iis程序池回收后也会需要重新加载(程序池默认是按需触发运行的,没人访问它就不启动了)

MVC的程序第一次访问比较慢的的问题由于第一次是要处理视图文件.cshtml(生成为.cs文件)、加载引用的dll程序文件和初始化程序池等等。

 

2.       参考资料

http://www.cnblogs.com/yangecnu/p/Speed-First-Startup-of-the-Entity-Framework.html

https://blogs.msdn.microsoft.com/amol/2013/01/25/application-initialization-ui-for-iis-7-5/

https://www.lanhusoft.com/Article/127.html