慎把“DataContext”静态化 或则单例
之前在项目里由于把DataContext静态化,最后在测试阶段发现了很多奇怪的问题,后来经过同事的指点 然后上网搜了一翻终于发现
MSDN上说: "请不要试图重用 DataContext 的实例。DataContext maintains state (including an identity cache) for one particular edit/query session.'>每个 DataContext 都会保持对应一个特定编辑/查询会话的状态(包括标识缓存)。DataContext.'>若要获取基于数据库当前状态的新实例,请使用新的 DataContext" 博客园上说: 不要将DataContext单例化
单个DataContext最大的问题就是SubmitChanges造成当前线程和数据库的数据不同步。DataContext不是线程安全的对象,由于它会缓存所有的数据操作,当A线程的数据修改到一半,它可能被B线程在调用SubmitChanges时提交了,这个问题在开发时不容易被发现。之前我在项目中用了单例模式创建DataContext,导致出现用户反应“为什么我在这篇文章的评论会跑到别的文章下面去了?!”之类的问题,正是因为这个原因。DataContext是LINQ to SQL框架的主入口点,它拥有所有表的映射让我觉得会占用很多资源,所以我用单例模式创建它。有人通过分析源代码得出结论:“DataContext并没有占用多么庞大的资源,无非就是一个DbConnection和一些映射对象而已。”,我才知道那只是映射,没有任何数据。MSDN上也提示:“请不要试图重用DataContext的实例。每个DataContext都会保持对应一个特定编辑/查询会话的状态(包括标识缓存)。若要获取基于数据库当前状态的新实例,请使用新的DataContext。”
因此,DataContext是不应该被单例化或是静态化的。DataContext是轻量级的资源,创建它不需要很大的开销,最佳实践是为每个操作创建新的DataContext实例。
慎把“DataContext”静态化 或则单例的更多相关文章
- java笔记之静态修饰附和单例设计模式
第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1) 用 ...
- Java面向对象 Main函数 静态的应用 单例设计模式
Java面向对象 Main函数 静态的应用与单例设计模式 知识概要 (1)Main函数的细解 (2)静态的应用,静态变量,静态代码块,静态函数 (3)单例设计模式 1.M ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- 《JAVA笔记 day08 静态_单例》
//static关键字: /* 静态方法的使用注意事项: 1,静态方法不能访问非静态的成员. 但是非静态是可以访问静态成员的. 说明:静态的弊端在于访问出现了局限性.好处是可以直接别类名调用. 2,静 ...
- Kotlin入门(28)Application单例化
Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- java新手笔记11 类的静态属性、方法(单例)
1.Person类 package com.yfs.javase; public class Person { String name;//每个对象上分配 与对象绑定 int age; char se ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- QT中实现应用程序的单例化
一介绍 通过编写一个QSingleApplication类,来实现Qt程序的单例化,原文的作者是在Windows Vista + Qt4.4 下实现的,不过应用在其他平台上是没问题的.(本文是我在ht ...
随机推荐
- PAT1020. Tree Traversals
//典型后中省树,这种方法必须有 中序序列来确定根的位置,然后二分建树: //因为用的vc,之前用序列位置建树通不过,用坐标建树通过了,怀疑vc的功能限制,有时间再来测试,眼下感觉还是坐标好啊,用地址 ...
- Anaconda日志
https://fedoraproject.org/wiki/Anaconda/Logging Anaconda日志 centos7 anaconda安装日志目录 /var/log/anaconda ...
- Delphi Form的释放和隐藏:free,hide,close
form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再 ...
- 【MySQL】MySQL/MariaDB的优化器对in子查询的处理
参考:http://codingstandards.iteye.com/blog/1344833 上面参考文章中<高性能MySQL>第四章第四节在第三版中我对应章节是第六章第五节 最近分析 ...
- vs2010 编译curl-7.42.1
curl是一个sftp ssl 等功能工具. dos 进入到curl-7.42.1\lib下来:逐步执行以下操作 call "C:/Program Files/Microsoft Visua ...
- HBase简介(很好的梳理资料)
http://www.tuicool.com/articles/iieIz2 一. 简介 history started by chad walters and jim 2006.11 G re ...
- Sublime Text 2/3安装CTags实现函数跳转
安装ctags 下载 ctags程序,放到目录D:/ctags/下 安装ctags插件 1. 打开Sublime Text 2. Preferences->Package Control-> ...
- 【转】Linux Kernel __setup(str, fn)解析
__setup这条宏在Linux Kernel中使用最多的地方就是定义处理Kernel的启动参数的函数及数据结构,宏定义如下: #define __setup(str, fn) \ __setup_p ...
- (二)、NodeJS 、Express4安装使用方法
第一步:安装Nodejs 第二步:安装express等部件 1.打开命令窗口,安装express.jade npm install -g express npm install -g express- ...
- 一些CSS"bug"
1.img三像像素问题 解决办法:img{display:block;} or img{vertical-align:middle;} 问题原因:img是行内元素,默认的垂直对齐方式 baseline ...