首页 新闻 会员 周边 捐助

EF读取上下文分离是否可行

0
悬赏园豆:20 [已解决问题] 解决于 2013-09-27 17:26

如题,若所有的读取操作均使用同一个上下文来获取,那么好处仅仅是减少了该上下文的创建时间?如果我这样做了以后的项目中会面临什么问题?数据同步?EF会缓存查询的结果嘛?

注:更新和添加的操作均使用新的创建的上下文,即每个HttpCpontext请求都是用新创建的上下文

tongling的主页 tongling | 初学一级 | 园豆:30
提问于:2013-09-27 11:12
< >
分享
最佳答案
1
  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();
        }

 

收获园豆:15
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2013-09-27 11:26

上面的代码并不是EF上下文的读写分离吧,应该是针对每个HttpContext请求实例都使用新建的上下文

tongling | 园豆:30 (初学一级) | 2013-09-27 12:01

@那一年的码农: 你不会用2个context啊

因为用全局的静态的无生命周期的context肯定会报错 至于为什么不知道!可能和线程竞争有关。

我这个提供了 在同一个request内 用一个context

你如果要读写分离的话 读用一个 写用一个context不就好了

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2013-09-27 13:17

@小眼睛老鼠: 读用一个,写当然不能用一个啦

tongling | 园豆:30 (初学一级) | 2013-09-27 13:24
其他回答(4)
0

本来我也是这么想的,但是前几天用两个实体上下文多表查询的时候报错了:“一个实体对象不能由多个 IEntityChangeTracker 实例引用”。后来改成楼上就好了。

一羽赐命 | 园豆:11 (初学一级) | 2013-09-27 11:53
0

创建上下文的开销并不大

收获园豆:5
dudu | 园豆:30925 (高人七级) | 2013-09-27 11:56

也就是说对于EF上下文查询分离并无优势

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2013-09-27 11:58

@那一年的码农: 不是,是“读取操作均使用同一个上下文来获取”并无优势

支持(0) 反对(0) dudu | 园豆:30925 (高人七级) | 2013-09-27 12:09

@dudu: 大神有木有EF读写分离比较好的例子分享一下?

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2013-09-27 12:23

@那一年的码农: 目前没发现这样的例子

支持(0) 反对(0) dudu | 园豆:30925 (高人七级) | 2013-09-27 17:18

@dudu: 是因为ADO.net连接池?

支持(0) 反对(0) test1001 | 园豆:194 (初学一级) | 2015-01-19 20:47

@test1001: 不是

支持(0) 反对(0) dudu | 园豆:30925 (高人七级) | 2015-01-19 23:43
0

一般是一个页面或者Controller一个Context啊。

幻天芒 | 园豆:37205 (高人七级) | 2013-09-27 12:53

就算在一个页面声明了全局的context但是调用一个函数返回之后这个context不会释放吗?我理解的用函数内的局部变量和controller生命的全局变量应该没差别。不知道对不对,求指教。

支持(0) 反对(0) 徐牛 | 园豆:282 (菜鸟二级) | 2013-09-27 14:23

@徐牛:局部的作用域更小,容易被回收吧,具体还真不清楚,哈哈~同求大神解惑。 

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-27 14:28

@幻天芒: 刚学web开发,对web开发下的变量声明整齐不太明白。web不是无状态的吗?MVC中controller对象会保存多长时间?不是来一个请求就创建吗?

支持(0) 反对(0) 徐牛 | 园豆:282 (菜鸟二级) | 2013-09-27 14:34

@徐牛: 一个请求就会创建一次。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-27 14:49

@幻天芒: 对啊。那把context放到controller全局变量和放到函数内还有差别吗?

支持(0) 反对(0) 徐牛 | 园豆:282 (菜鸟二级) | 2013-09-27 14:51

@徐牛: 静态变量和函数局部变量是不一样的!差别大了。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-27 15:01

@幻天芒: 额,我明明说的是Controller类内的全局变量……你说的一个controller一个context的context是静态的?

支持(0) 反对(0) 徐牛 | 园豆:282 (菜鸟二级) | 2013-09-27 15:04

@徐牛: 哦,那这就没什么区别了。我一般也是申明在头部的。一个Controller一个,哈哈~~

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-27 15:05
0

以前只听说过mysql 主从库提升性能,不明白这种上下文读写分离性能提升是什么原理?

徐牛 | 园豆:282 (菜鸟二级) | 2013-09-27 14:25

可以解决高访问的因为锁表线程竞争的问题!但是前提是高并发,如果不考虑这种情况,这种做法基本没有意义

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2013-09-29 14:42

@小眼睛老鼠: 可是即使上下文不同访问的不还是一个表?还是说一个上下文锁整个库?

支持(0) 反对(0) 徐牛 | 园豆:282 (菜鸟二级) | 2013-09-30 08:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册