微软推出的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(预生成映射视图)
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分钟都没有请求这个应用程序池工作进程就要关闭。这里你可以设置根据自己需要设置长一些。
相关推荐
- **懒加载与预加载(Eager Loading)**: 需要注意懒加载可能导致额外的数据库查询,而预加载可以通过Include()方法一次性加载关联数据。 - **查询优化**: 尽量减少对数据库的往返次数,避免在Linq查询中使用Select...
- **定义:** 当实体第一次被读取时,相关的导航属性不会立即加载,直到第一次访问该导航属性时才会加载。 - **优缺点:** - **优点:** 可以加快初始加载速度,因为不需要加载所有的相关数据。 - **缺点:** 会增加...
EF可能会自动处理一部分内存管理,但开发者仍需注意避免一次性加载过多数据。 9. **扩展性与并发:** 针对高并发环境,开发者可能利用EF的异步操作、事务处理和连接池来提升系统扩展性和并发性能。 综上所述,...
4. **避免在循环中执行数据库操作**:这会导致多次数据库访问,改为一次性处理所有数据。 5. **使用跟踪查询(Tracking Queries)**:在读取大量数据时,使用`AsNoTracking()`禁用实体跟踪,减少内存占用。 6. **...
4. **分页设计**:在展示大量数据时,分页能提高性能并提供更好的用户界面,避免一次性加载所有数据导致的性能问题。 5. **EF入门**:这表明教程是为那些刚开始接触或希望了解如何使用EF的开发者准备的,提供基础...
StyleCat的出现就是为了解决这个问题,它将所有的`@import`语句一次性处理,合并所有引用的CSS内容到一个文件中,从而提高页面的加载速度。 在`ef2k-stylecat.zip`压缩包中的`stylecat-master`文件夹中,我们可以...
第40部分 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读) 第41部分 使用对象服务之标识关系中使用依赖实体与异步查询保存 第42部分 POCO之使用POCO 第43部分 POCO之使用...
在本示例中,我们将深入探讨如何使用EF中的DbContext类来创建一个简单的数据库操作DEMO,这对于初学者来说是一次很好的入门实践。 **1. 安装EF** 首先,你需要在你的项目中安装Entity Framework。如果你使用的是...
标签进一步强调了关键点:“clover”再次确认了Clover的重要性,“K660D EFI”指明这是针对特定型号(神舟K660D)的EFI配置,“黑苹果”暗示这是一次非官方的苹果系统安装,“神舟K660”可能是对型号的另一种表述或...
第一 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.再...
当遇到“Tomcat重新配置后启动慢”的问题时,开发者或运维人员可能会面临一系列挑战,这不仅影响到工作效率,还可能导致服务中断。本文将深入探讨这个问题,并提供有效的解决方案。 首先,我们要理解Tomcat启动慢...
6. **懒加载和预加载**:懒加载是在需要时才加载关联数据,而预加载则是在查询主体对象时一次性加载所有关联数据。EF Core提供了这两种策略来处理一对多或多对多的关系。 7. **仓储(Repository)和单元工作(Unit ...
Trasher2是一个典型的Web应用程序,它采用Entity Framework 6 (EF6)、MVC5框架,并结合OAuth2进行用户授权管理。这个项目展示了如何在.NET环境中构建一个安全、高效的Web应用。以下是对该项目的关键知识点的详细解析...
4. **第一级缓存**:Entity Framework使用第一级缓存,已加载的实体会被缓存,再次请求时不会再次查询数据库。 ## 扩展性与社区支持 EF4拥有丰富的社区扩展,例如Entity Framework Power Tools用于增强开发体验,...
例如,可以关闭延迟加载以减少不必要的数据库查询,或者开启预加载以一次获取所有关联数据。 8. **数据库提供程序**:EF支持多种数据库系统,如SQL Server、MySQL、SQLite等。配置文件可以指定使用的数据库提供程序...
以上是对Entity Framework的入门介绍,文档"Entity_framework第一篇"、"Entity_framework第二篇"、"Entity_framework第三篇"和"Entity_framework第四篇"将进一步深入讲解各个主题,包括更复杂的查询、事务处理、...
窗口的第一行是“标题栏”,通常包含应用程序的名称和一个包含“最小化”、“最大化”(或“还原”)和“关闭”按钮的区域,而不是“恢复”和“移动”按钮。标题栏的左边通常会有一个代表应用程序的图标。 当窗口被...
- **概念**:一次性加载整个对象及其关联实体。 - **实现**:使用`Include`方法多次调用来加载多个级别的关联实体。 **5-6 加载派生类型上的导航属性** - **概念**:在继承关系中加载派生类型的关联实体。 - **...
在大型列表中,一次性加载所有图片可能导致性能问题。因此,"Lazy Loading"(延迟加载)技术被广泛采用,只在需要时才加载图片。LazyTableImages库可能提供了实现这一功能的示例代码或工具。 在实际开发中,实现...