MVC UnitOfWork EntityFramework架构
最近参考使用了郭明峰的一套架构来做新的项目架构,这套架构看起来还是不错的,先向小郭同学的分享精神致敬!
(郭同学的项目文档:http://www.cnblogs.com/guomingfeng/archive/2013/05/19/mvc-overall-design.html)
项目开发上线后,傻眼了,貌似没有几个人访问的新项目,速度一直慢的跟牛一样,真心没法交差啊。上面发下话了,解决不了就可以走人了。压力可想而知。
接下来就是苦逼的找原因了。
症状:1、内存占用高,8g的内存很快就能吃完
2、网站相应速度慢,firebug检测每次都是在等待
根据这些症状,感觉是内存泄露了,于是memory profiler。。。什么性能分析工具都用上了,怎奈水平有限,不会使用这些高级玩意,一番折腾下来,就剩下无奈。
但总不能放弃,对比之前做的mvc项目,就是多了entityframework、MEF这两样,看样子也就这两块的原因了,EF的嫌疑最大,而且首次使用,并不了解。于是,接下来又是一段苦逼的研究;功夫不负有心人,根据目前研究的结果及上线的效果来看,基本上找到了问题的所在。总结下,与诸位分享,高手忽略。
问题原因:1、很多数据查询一次性读入到内存中,导致内存增加。
2、上下文对读入到内存中的数据对象会进行跟踪,导致内存不断攀升,疑似内存泄露
解决办法:1、深入学习EF,监控每一步生成的sql语句,防止无用数据的调取
2、网站大部分的数据在读取的时候是不需要进行上下文跟踪的,一定要禁止跟踪,否则内存就会爆了!代码如下:

/// <summary>
/// 获取当前实体的查询数据集(通过读上下文进行读取,只读专用,返回的实体数据不会被上下文跟踪)
/// </summary>
public virtual IQueryable<TEntity> ReadEntities
{
get { return WriteContext.Set<TEntity>().AsNoTracking(); }
} /// <summary>
/// 获取当前实体的查询数据集(通过写上下文进行读取,修改专用,返回的实体数据会被上下文进行跟踪)
/// </summary>
public virtual IQueryable<TEntity> WriteEntities
{
get { return WriteContext.Set<TEntity>(); }
}

说明:我在仓储模式中,对读取实体集合进行了修改,ReadEntities表示不需要进行跟踪的,加上AsNoTracking方法;WriteEntities表示是需要跟踪的,用于修改实体信息使用。这样以来,所有的症状全部消失了。
当然,也许有更好的优化方法,至少目前本人发现了这些问题所在,而且微软的白皮书中确实也讲的了EF的性能注意事项,怎奈仓促开发,对EF毫不了解,罪过罪过!大家引以为鉴!
另外,还遇到一个问题,不知道是否是DBcontext线程冲突问题,大家帮分析下,谢谢:
MVC UnitOfWork EntityFramework架构的更多相关文章
- 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的mem ...
- 转载——Asp.Net MVC+EF+三层架构的完整搭建过程
转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...
- 【转】浅谈MVC与三层架构
首先给大家引入下MVC的概念: MVC(Model View Controller)模型.视图以及控制器,它是一种较为广泛应用的结构设计模式. 模型:就是在MVC设计模式中需要被显示的数据.在通常情况 ...
- Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目
原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...
- MVC与三层架构的区别
我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. ...
- mvc和三层架构到底有什么区别
原文地址:http://zhidao.baidu.com/question/82001542.html?qbl=relate_question_3&word=MVC%20%CA%FD%BE%D ...
- MVC与三层架构
我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. ...
- MVC+UnitOfWork+Repository+EF
MVC+UnitOfWork+Repository+EF UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无 ...
- 转载Mvc的多层架构
Mvc的多层架构 分享一个Mvc的多层架构,欢迎大家拍砖斧正 多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有 ...
随机推荐
- springmvc+ztree v3实现类似表单回显功能
在做权限管理系统时,可能会用到插件zTree v3,这是一个功能丰富强大的前端插件,应用很广泛,如异步加载菜单制作.下拉选择.权限分配等.在集成SpringMVC中,我分别实现了zTree的添删改查, ...
- 《C++ Primer Plus》学习笔记6
<C++ Primer Plus>学习笔记6 第11章 使用类 <<<<<<<<<<<<<<<&l ...
- JQUERY 选择
jQuery 选择器 jQuery 采用 CSS 一个选择选择 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") 选取 ...
- 初学git && 使用总结
参考文章:http://www.ruanyifeng.com/blog/2014/06/git_remote.html git基础操作 http://www.ruanyifeng.com/blog ...
- C# 线程知识--使用Task执行异步操作
在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务.线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值.但是在C#4.0中引人了一个的任 ...
- 面向对象三大特征之封装与static——(Java学习笔记四)
面向对象 编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一 ...
- BFS、双向BFS和A*
BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...
- PB控制性能TreeView
TreeView [其它] ■TreeView控件能够以树型方式来组织项目.不仅显示直观.界面友好.并且项目的管理和操作更为方便,是当前比較流行的一个控件. 该控件的特点是在较小的空间能够分层次显示大 ...
- TFTP server组态
TFTP server组态 2014-10-31北京海淀区 张俊浩 一.TFTP(Trivial File Transfer Protocol,简单文件传输协议或称小型文件传输协议) 是一种简化的文 ...
- 华为-on练习--身高找到最好的二人
称号: 离5个人选择2个人作为礼工具.中的每个个体的身高的范围160-190,要求2个人高差值至少(假设差异值一样,他们中最高的选择).输出的两个人的身高升序. Smple input:161 189 ...