【翻译】提示18——如何决定ObjectContext的生命周期
作者:Alex D James
我们经常碰到一个问题是ObjectContext应对存活多久。经常被引用的选项包括:
- 函数(Function)
- 窗体(Form)
- 线程(Thread)
- 应用程序(Application)
很多人都在问这类型的问题,典型的例子是在Stackflow上的问题。我相信有更多的类似问题被埋没在我们的论坛上。
这是一个经典的取决于类型的问题。
做出决定有许多权衡因素,主要包括:
- 处置(Disposal):
干净处置ObjectContext和它的资源是很重要的。如果为每一个函数创建一个新的ObjectContext,这会容易很多,因为可以简单的使用using块来确保适当的释放资源。
using (MyContext ctx = new MyContext())
{
…
}
- 构建的花费(Cost Of Construction):
许多人比较关注重一次又一次的重新创建ObjectContext的花费,这完全可以理解。现实情况是这种成本其实很低,因为大部分时候,它只涉及到通过引用将元数据从全局缓存中复制到新的ObjectContext。基本上,我不认为这种成本是值得担心的,但一如既往,这规则存在例外情况。
- 内存使用(Memory Usage):
越多的使用一个ObjectContext,基本上它就会越占内存。这是因为,基本上无论是查询、添加或附加,它都要保存对所有实体的引用。因此,必须考虑无限期地共享相同的ObjectContext所存在的问题。尽管对于这种情况有一些例外和解决办法,但大部分时候,不建议这样做。
○ 如果ObjectContext只是执行NoTracking查询,那么它不会变大,因为它会立即忘记这些实体。
○可以实现一些非常明确的善后逻辑,即实现某种形式的循环接口,遍历ObjectStateManager中分离的实体和AcceptingChanges(..) 来放弃删除对象。注意:我不建议这样,我只是说,它应用有可能,因为我不知道相对于重新创建,它是否会导致保存。这也许是未来博客文章的一个好题材。
- 线程安全(Thread Safety):
如果尝试去重用一个ObjectContext,你应该知道,它不是线程安全的,这类似于标准的.NET集合类。如果你从许多线程(如web请求)中访问它,你就要确保手动进行同步访问。
- 无状态(Stateless):
如果你的服务被设计为无状态的,其实大多数Web服务应该是这样,在请求之间重用ObjectContext可能不是最好的,因为最后一次通话的ObjectContext的残余(leftovers)可能会产生微秒的影响,而这并不是应用程序所预期的。
- 自然有限的生命周期(Natural finite lifetimes):
如果你使用一个自然有限的生命周期的方式来管理ObjectContext,如一个短周期的窗体,一个UnitOfWork,或一个存储库,那么有作用范围的ObjectContext可能是最好的实现。
正如你所看到的,有许多因素在起作用。
他们中的大多数倾向于短生命周期的上下文,而不是共享的。
因此,这就是我推荐的法则。
然后,只有了解了这背后的“推理法则”,才有助于在适当的时候采用适合自己的方式。
【翻译】提示18——如何决定ObjectContext的生命周期的更多相关文章
- Maven的构建生命周期理解
以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...
- Maven构建生命周期
以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...
- Unity(二)生命周期LifetimeManager
描述:Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理. //创建一个Unit ...
- [IoC容器Unity]第二回:Lifetime Managers生命周期
1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...
- [转载][IoC容器Unity]第二回:Lifetime Managers生命周期
1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
- [翻译] Autofac 控制范围和生命周期
原文链接:http://docs.autofac.org/en/latest/lifetime/index.html Lifetime 是指服务的实例在程序中存活多久 – 从最初的实例化到清理(dis ...
- (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记
第五课: 1.UITextView @property (nonatomic, readonly) NSTextStorage *textStorage;//注意为只读属性,因此不能直接更改内容,NS ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...
随机推荐
- 计算机网络之IP地址
IP地址的分类 整个的因特网就是一个单一的.抽象的网络.IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围内唯一的32位的标识符. 所谓分类的IP地址,就是将IP地址划分为 ...
- 20160209.CCPP体系详解(0019天)
程序片段(01):01.字符串.c 内容概要:字符串 #include <stdio.h> #include <stdlib.h> #include <locale.h& ...
- (一)ROS系统入门 Getting Started with ROS 以Kinetic为主更新 附课件PPT
ROS机器人程序设计(原书第2版)补充资料 教案1 ROS Kinetic系统入门 ROS Kinetic在Ubuntu 16.04.01 安装可参考:http://blog.csdn.net/zha ...
- linux中probe函数传递参数的寻找(下)
点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...
- Linux 高性能服务器编程——多进程编程
问题聚焦: 进程是Linux操作系统环境的基础. 本篇讨论以下几个内容,同时也是面试经常被问到的一些问题: 1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...
- [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat
本文地址:http://blog.csdn.net/sushengmiyan/article/details/43154543 本文作者:sushengmiyan ------------------ ...
- XML Schema
XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XMLSchema 定义(XML Schema Defi ...
- 剑指Offer——网易笔试之解救小易——曼哈顿距离的典型应用
剑指Offer--网易笔试之解救小易--曼哈顿距离的典型应用 前言 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走 ...
- 插件开发之360 DroidPlugin源码分析(一)初识
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52123450 DroidPlugin的是什么? 一种新的插件机制,一种免安装的运行机制 ...
- (一〇三)静态库(.a)的调试
上节介绍的方法,只能创建静态库而不能调试,因为直接创建静态库工程并非可执行文件. 本文介绍的方法创建的静态库断点能够在调试时起作用. 为了能够调试静态库,应该在一个可执行工程(例如Single Vie ...