首页 新闻 会员 周边 捐助

关于DbContext的两种存在方式,有什么区别?

0
悬赏园豆:5 [已解决问题] 解决于 2014-03-04 16:43

第一种是通过调用存在线程中的DbContext来使用,如下:

public OuOAstuEntities GetDB()

{
  var db = CallContext.GetData("TestEntities") as TestEntities;
  if (db == null)
  {
    db = new TestEntities();
    CallContext.SetData("TestEntities", db);
  }
  return db;
}

 

第二种是用完即销毁,如下:

using(DbContext db=new DbContext())

{}

请问这两种方法有什么区别吗,各有什么优劣吗?例如同时处理大数据的时候可能会有什么问题

Dunn的主页 Dunn | 初学一级 | 园豆:129
提问于:2014-03-03 21:57
< >
分享
最佳答案
1

官方的说法就是:

1、建立DBContext是一个比较消耗时间的事情,所以如果想减少每次建立连接所消耗的这段时间,(其实这个时间对大部份人来说,不长,对于性能狂来说,例外)

你可以把DBContext一直保存起来,不DISPOSE。

2、所有的方法都有优缺点的,第二种方法的缺点正好是上面说的第一种方法的优点。

那么第二种方法的优点是什么呢,简单一点说,不占用资源。

3、程序员的作用就是分清楚,或者学会在不同的应用环境下,使用不同的方式。

通常实现一种功能、应用的方式都会N种以上,有时候空间换时间,有时候时间换空间。

就看那时候,你是时间宝贵还是空间宝贵。

4、不明白你说的大数据是啥,不会是指现在社会上流行的大数据吧?我想是不会的,那就需要麻烦你解决下了。

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-03-04 10:02

谢谢啊,回答很详细,一下子明白了。我的大数据指的是如果同时有数十万条增删改查在进行的话,那么这时候。

(1)用第一种会不会出现问题,因为它有缓存,如果缓存没及时清的话,我变动的是缓存中的数据,这时候数据还没及时更新到数据库中,会不会有这问题;

(2)第二种不断new一个,然后dispose对性能的消耗会不会很大,还有会不会有这样一个问题,我数据还没传到UI的时候DbContext就已经销毁了,有这种情况出现吗?这时数据能传过去吗?

Dunn | 园豆:129 (初学一级) | 2014-03-04 10:10

@Dunn: 

1、你的10万条是一次性保存,还是不同的人在保存,第一种的主要可能产生的问题是

不支持多线程DataReader,你可以自己试验一下,用传统的DATAREADER,

一个DATAREADER没有关闭之前,使用另一个DataReader是会报错的。

2、所以的消耗是不是很大,得看你怎么用,几秒一次,还是几分钟一次,还是几个小时一次。

使用Using.... End Using的话,你是没有办法只传DataReader回前台的,

你在前台一使用

For each row in YourTable

next 

就会报错。

你要使用Using .... End Using的前提是,你在这里面把与数据库相关的事情做完,

比如把数据读完放在List里面或者DataSet或者你的对象列表里面。

因为End using执行后,DBContext就不存在了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-03-04 10:19

@爱编程的大叔: 谢谢啊,受益匪浅,我尝试下

Dunn | 园豆:129 (初学一级) | 2014-03-04 10:21

建立DBContext是一个比较消耗时间的事情,所以如果想减少每次建立连接所消耗的这段时间,(其实这个时间对大部份人来说,不长,对于性能狂来说,例外)

-----------------------------------------------------------

偶然看到,不敢苟同,

1 DbContext是一个非常轻量级的东西。MS的建议是即用即抛。

2 如果做Web开发的话可以用DI给它缓存起来,但是要InstancePerHttpRequest,这样可以一定程度上加快访问,比如说,你是用DbSet的Find,如果已经Find过一次的时候,第二次Find是直接从内存加载的。

3 绝不建议全局个DbContext,或者跨HttpRequest的DbContext(除非你是Winform的使用场景,单机,单用户),因为会有并发问题。

~洛书~ | 园豆:333 (菜鸟二级) | 2015-11-27 10:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册