`

EF第一次加载慢

    博客分类:
  • EF
阅读更多

微软推出的EF6框架虽然比较便利,但是使用的时候会发现第一次运行加载速度特别慢,而且过一段时间没有加载或访问又会变慢,之前一直以为是服务器硬件配置问题或者跟数据库产品有关,后来上网查了资料以后,发现确实是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分钟都没有请求这个应用程序池工作进程就要关闭。这里你可以设置根据自己需要设置长一些。

分享到:
评论

相关推荐

    MVC5 EF6 Code First启动速度优化

    C# EF框架 sqlserver

    - **懒加载与预加载(Eager Loading)**: 需要注意懒加载可能导致额外的数据库查询,而预加载可以通过Include()方法一次性加载关联数据。 - **查询优化**: 尽量减少对数据库的往返次数,避免在Linq查询中使用Select...

    EF基本增删改查附百万级数据测试

    EF可能会自动处理一部分内存管理,但开发者仍需注意避免一次性加载过多数据。 9. **扩展性与并发:** 针对高并发环境,开发者可能利用EF的异步操作、事务处理和连接池来提升系统扩展性和并发性能。 综上所述,...

    EFCore调优 EFCore调优

    4. **避免在循环中执行数据库操作**:这会导致多次数据库访问,改为一次性处理所有数据。 5. **使用跟踪查询(Tracking Queries)**:在读取大量数据时,使用`AsNoTracking()`禁用实体跟踪,减少内存占用。 6. **...

    EF入门程序(实现增删改查,包含详细步骤)

    4. **分页设计**:在展示大量数据时,分页能提高性能并提供更好的用户界面,避免一次性加载所有数据导致的性能问题。 5. **EF入门**:这表明教程是为那些刚开始接触或希望了解如何使用EF的开发者准备的,提供基础...

    开源项目-ef2k-stylecat.zip

    StyleCat的出现就是为了解决这个问题,它将所有的`@import`语句一次性处理,合并所有引用的CSS内容到一个文件中,从而提高页面的加载速度。 在`ef2k-stylecat.zip`压缩包中的`stylecat-master`文件夹中,我们可以...

    Entity Framework 6 Recipes(中文word翻译版)

    第40部分 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读) 第41部分 使用对象服务之标识关系中使用依赖实体与异步查询保存 第42部分 POCO之使用POCO 第43部分 POCO之使用...

    .net EF DBcontext 简单demo

    在本示例中,我们将深入探讨如何使用EF中的DbContext类来创建一个简单的数据库操作DEMO,这对于初学者来说是一次很好的入门实践。 **1. 安装EF** 首先,你需要在你的项目中安装Entity Framework。如果你使用的是...

    神舟K660D EF Clover 文件 支持10.14,10.13

    标签进一步强调了关键点:“clover”再次确认了Clover的重要性,“K660D EFI”指明这是针对特定型号(神舟K660D)的EFI配置,“黑苹果”暗示这是一次非官方的苹果系统安装,“神舟K660”可能是对型号的另一种表述或...

    AP192EF量产工具 实用

    第一 4g 或 chip 死 可支援. 3. flash.des 修改格式 4. Test Pattern Level 1~5 ,ECC Bits 0~4 5. Option 中可自选 single plane or two plane 等功能. 2008/09/04 2038 AP192 ptool v1.00c 增加: 1.再...

    Entity Framework Core.zip

    6. **懒加载和预加载**:懒加载是在需要时才加载关联数据,而预加载则是在查询主体对象时一次性加载所有关联数据。EF Core提供了这两种策略来处理一对多或多对多的关系。 7. **仓储(Repository)和单元工作(Unit ...

    Trasher2:EF6 MVC5 OAuth2应用第二次通过

    Trasher2是一个典型的Web应用程序,它采用Entity Framework 6 (EF6)、MVC5框架,并结合OAuth2进行用户授权管理。这个项目展示了如何在.NET环境中构建一个安全、高效的Web应用。以下是对该项目的关键知识点的详细解析...

    entity framework 4

    4. **第一级缓存**:Entity Framework使用第一级缓存,已加载的实体会被缓存,再次请求时不会再次查询数据库。 ## 扩展性与社区支持 EF4拥有丰富的社区扩展,例如Entity Framework Power Tools用于增强开发体验,...

    Entity Framework配置文件设置

    例如,可以关闭延迟加载以减少不必要的数据库查询,或者开启预加载以一次获取所有关联数据。 8. **数据库提供程序**:EF支持多种数据库系统,如SQL Server、MySQL、SQLite等。配置文件可以指定使用的数据库提供程序...

    Entity_framework教程

    以上是对Entity Framework的入门介绍,文档"Entity_framework第一篇"、"Entity_framework第二篇"、"Entity_framework第三篇"和"Entity_framework第四篇"将进一步深入讲解各个主题,包括更复杂的查询、事务处理、...

    IPHONE下拉刷新列表代码

    在大型列表中,一次性加载所有图片可能导致性能问题。因此,"Lazy Loading"(延迟加载)技术被广泛采用,只在需要时才加载图片。LazyTableImages库可能提供了实现这一功能的示例代码或工具。 在实际开发中,实现...

    winfrom 分页控件

    数据加载策略可以是懒加载,即只在切换页面时加载对应页的数据,这样可以避免一次性加载大量数据导致的性能问题。 对于文件"winfrom分页控件",这可能是包含示例代码、教程或控件库的资源,用于帮助开发者理解如何...

    ASP.NET MVC分页

    ASP.NET MVC 分页是Web开发中的一个重要概念,它在处理大量数据时尤为关键,因为一次性加载所有数据可能会导致页面响应速度变慢,甚至对服务器造成过大压力。在ASP.NET MVC框架中,我们可以利用内置的工具和自定义...

    飞思卡尔8位单片机MC9S0804程序HC08CPU与汇编基础指令系统.doc

    值得注意的是,`LDHX`指令一次读取两个连续的存储器单元,第一个单元的数据放入H,第二个单元的数据放入X。 2. 存数指令(Store): - `ST`指令将A、X或HX寄存器中的数据存储回存储器,同样有8种寻址方式与取数...

    treeListView_usuallysi2_www6eebb36b9e66cOm_www6eebb36b9e66cOm_安卓

    8. **性能优化**:因为ListView的优化是Android开发中的重要一环,对于树状列表,你需要注意只渲染可视区域内的节点,避免一次性加载所有数据导致内存消耗过大。 9. **线程管理**:如果数据加载较慢,可以考虑使用...

Global site tag (gtag.js) - Google Analytics