关于 EF 对象的创建问题
在开发过程中,项目往往被划分为多层,而一个请求过来往往是从表示层开始一层一层向下调用,那么如果我们在不同的层中都使用到了 EF 上下文对象,而
有好几层都这么创建一个 EF 对象然后对其进行操作,那么最终哪一层的 EF 对象是我们需要的最新的数据就很难确定了,这是就很容易产生脏读。
在这种情况下,我们首先会想到使用单例模式,这样在整个应用程序的生命周期内只允许被创建一次。但是这样又会出现一个问题,所有的用户都访问同一个
EF 对象,随着访问的用户越来越多,这个 EF 对象的资源无法及时释放,导致占用的内存也会越来越大,虽然垃圾回收机制会自动回收掉大部分内存,但是有一些
内存对象是需要我们手动回收的,可是在这里我们又不能使用 using 直接回收这个单例对象,因为如果把单例对象释放了,大家就都访问不了了,所以无法使用单例
模式来解决这份 EF 对象的创建问题。
真正的解决办法:
这时,创建线程对象就可以了,我们只需要保证 EF 对象在一个线程内唯一,一个请求就是一个线程,这样就无须关心多层直接操作 EF 对象的问题了。
HttpContext 对象就是微软封装的一个线程对象,完全可以把创建的 EF 对象存到 HttpContext 对象中,实现 EF 对象在线程中唯一。
public NorthwindEntities DB2
{
get
{
NorthwindEntities db = null;
if(HttpContext.Items["db1"] == null)
{
db = new NorthwindEntities();
HttpContext.Items["db1"] = db;
}
else
{
db = HttpContext.Items["db1"] as NorthwindEntities;
}
return db;
}
}
关于 EF 对象的创建问题的更多相关文章
- 图解JAVA对象的创建过程
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...
- JVM中对象的创建过程
JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...
- 《JavaScript高级程序设计》读书笔记--(4)对象的创建
ECMAScript支持面向对象(OO)编程,但不使用类或者接口.对象可以在代码执行过程中创建或增强,因此具有动态性而非严格定义的实体.在没有类的情况下,可以采用下列模式创建对象. 对象的创建 工厂模 ...
- java 对象 :创建
灵感来自effective java 关于对象,是java的核心,如何有效的创建其实是一个值得关注的地方. 1.静态工厂:这是一个值得关注的,并且应该时刻考虑的方法. 优点:1.他是有名字的,这个是如 ...
- 深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位
对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object
- java类的初始化和对象的创建顺序
学习java编程思想--类的初始化p146 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和stati ...
- Emit学习(2) - IL - 对象的创建过程
上一篇的介绍中, 并没有介绍到对象的创建过程, 这一篇主要就介绍一下, 对象的创建过程. 其实熟悉了IL语法之后, 完全可以用Reflector反编译代码去查看. 而且正因为有这个工具, 可以对照着R ...
- JavaScript对象的创建之基于构造方法+原型方式
为了解决原型所带来的问题,此处需要通过组合构造方法和原型来实现对象的创建,将属性在构造方法中定义,将方法在原型中定义.这种有效集合了两者的优点,是目前最为常用的一种方式. function Perso ...
- JavaScript对象的创建之使用json格式定义
json: javascript simple object notation. json就是js的对象,但是它省去了xml中的标签,而是通过{}来完成对象的说明. 定义对象 var person = ...
随机推荐
- python学习 day018打卡 反射
本节主要内容: 1.isinstance,type,issubclass 2.区分函数和方法 3.反射(重点) 一.isinstance,type,issubclass issubclass():判断 ...
- Jedis使用
Jedis是java调用Redis的接口. 一.Maven中的jedis依赖包 <!-- https://mvnrepository.com/artifact/redis.clients/jed ...
- [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义
转自 http://blog.csdn.net/restraint/article/details/39934401 说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的 ...
- Excel 常用设置
首行固定 视图->冻结窗口
- Promise的.then .catch
定义一个promise 调用promise 如果promise的状态为resolve 则 执行 .then 否则执行.catch 可以有多个.then 会按顺序执行 axios.post 可 ...
- java正则常用记录
1. java中 字符串的某个字母是否有某个指定字符N : for(int i=0;i<temp.length();i++){ if( temp.get(i).substring(0,1) ...
- Android之StrictMode
1. StrictMode是什么? StrictMode is a developer tool which detects things you might be doing by accident ...
- JavaScript中的prototype和__proto__细致解析
最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的 ...
- 常用命令-python篇
1. pip 加速命令 pip install --index-url https://pypi.douban.com/simple pip install -i https://pypi.tuna. ...
- Servlet 小知识
1.In servlet 3.0 we have new feature annotations to replace XML.也就是说应该尽量使用annotations Servlet is an ...