public static GLRISCRMContext Instant { get { if (HttpContext.Current.Items["_EntityContext"] == null) { lock (lockobj) { if (HttpContext.Current.Items["_EntityContext"] == null) { HttpContext.Current.Items["_EntityContext"] = new GLRISCRMContext(); } } } return HttpContext.Current.Items["_EntityContext"] as GLRISCRMContext; } } public static void Application_EndRequest(object sender, EventArgs e) { ((IDisposable)GLRISCRMContext.Instant).Dispose(); }
上面的代码并不是EF上下文的读写分离吧,应该是针对每个HttpContext请求实例都使用新建的上下文
@那一年的码农: 你不会用2个context啊
因为用全局的静态的无生命周期的context肯定会报错 至于为什么不知道!可能和线程竞争有关。
我这个提供了 在同一个request内 用一个context
你如果要读写分离的话 读用一个 写用一个context不就好了
@小眼睛老鼠: 读用一个,写当然不能用一个啦
本来我也是这么想的,但是前几天用两个实体上下文多表查询的时候报错了:“一个实体对象不能由多个 IEntityChangeTracker 实例引用”。后来改成楼上就好了。
创建上下文的开销并不大
也就是说对于EF上下文查询分离并无优势
@那一年的码农: 不是,是“读取操作均使用同一个上下文来获取”并无优势
@dudu: 大神有木有EF读写分离比较好的例子分享一下?
@那一年的码农: 目前没发现这样的例子
@dudu: 是因为ADO.net连接池?
@test1001: 不是
一般是一个页面或者Controller一个Context啊。
就算在一个页面声明了全局的context但是调用一个函数返回之后这个context不会释放吗?我理解的用函数内的局部变量和controller生命的全局变量应该没差别。不知道对不对,求指教。
@徐牛:局部的作用域更小,容易被回收吧,具体还真不清楚,哈哈~同求大神解惑。
@幻天芒: 刚学web开发,对web开发下的变量声明整齐不太明白。web不是无状态的吗?MVC中controller对象会保存多长时间?不是来一个请求就创建吗?
@徐牛: 一个请求就会创建一次。
@幻天芒: 对啊。那把context放到controller全局变量和放到函数内还有差别吗?
@徐牛: 静态变量和函数局部变量是不一样的!差别大了。
@幻天芒: 额,我明明说的是Controller类内的全局变量……你说的一个controller一个context的context是静态的?
@徐牛: 哦,那这就没什么区别了。我一般也是申明在头部的。一个Controller一个,哈哈~~
以前只听说过mysql 主从库提升性能,不明白这种上下文读写分离性能提升是什么原理?
可以解决高访问的因为锁表线程竞争的问题!但是前提是高并发,如果不考虑这种情况,这种做法基本没有意义
@小眼睛老鼠: 可是即使上下文不同访问的不还是一个表?还是说一个上下文锁整个库?