关于 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 = ...
随机推荐
- EF Core In-Memory Database Provider
原文链接 This can be useful for testing, although the SQLite provider in in-memory mode may be a more ap ...
- Kubernetes之Controllers三
StatefulSets StatefulSet is the workload API object used to manage stateful applications. Note: Stat ...
- spring 配置事务xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Spring-test单元测试
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test& ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- _itemmod_nopatch、_itemmod_nopatch_level、_itemmod_nopatch_spell、_itemmod_nopatch_src、_itemmod_nopatch_stat、_itemmod_nopatch_stat_prefix
原始物品(_itemmod_nopatch中Entry)需要能够装备 该功能产生的新物品不需要制作dbc 尽量避免配置主动技能(_itemmod_nopatch_spell) _itemmod_nop ...
- 两个DIV并排显示
今天做的一个项目,需要做3个div,一个是总框(Div1),另外两个是子框,按比例填满div1,我设置好两个div的width和height,发现效果是两个子div上下显示,如图所示: 要想将两个DI ...
- 使用pymongo连接mongodb时报错:pymongo.errors.OperationFailure: not authorized
连接本机或局域网部署的mongodb时可以用以下方法: from urllib import parse from pymongo import MongoClient host = '*.*.*.* ...
- vue-cli3+cordova实现app混合开发
一.安装vue-cli3 安装并建新项目 二.进入项目安装cordova npm install -g cordova 下载完之后,输入 cordova -v 查看是否成功安装,出现相应的版本号则成功 ...
- Python全栈开发-Day5-常用模块学习
本节大纲: 模块介绍 time &datetime模块 random os sys shutil shelve xml处理 pyyaml处理 configparser hashlib re正则 ...