第一种是通过调用存在线程中的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())
{}
请问这两种方法有什么区别吗,各有什么优劣吗?例如同时处理大数据的时候可能会有什么问题
官方的说法就是:
1、建立DBContext是一个比较消耗时间的事情,所以如果想减少每次建立连接所消耗的这段时间,(其实这个时间对大部份人来说,不长,对于性能狂来说,例外)
你可以把DBContext一直保存起来,不DISPOSE。
2、所有的方法都有优缺点的,第二种方法的缺点正好是上面说的第一种方法的优点。
那么第二种方法的优点是什么呢,简单一点说,不占用资源。
3、程序员的作用就是分清楚,或者学会在不同的应用环境下,使用不同的方式。
通常实现一种功能、应用的方式都会N种以上,有时候空间换时间,有时候时间换空间。
就看那时候,你是时间宝贵还是空间宝贵。
4、不明白你说的大数据是啥,不会是指现在社会上流行的大数据吧?我想是不会的,那就需要麻烦你解决下了。
谢谢啊,回答很详细,一下子明白了。我的大数据指的是如果同时有数十万条增删改查在进行的话,那么这时候。
(1)用第一种会不会出现问题,因为它有缓存,如果缓存没及时清的话,我变动的是缓存中的数据,这时候数据还没及时更新到数据库中,会不会有这问题;
(2)第二种不断new一个,然后dispose对性能的消耗会不会很大,还有会不会有这样一个问题,我数据还没传到UI的时候DbContext就已经销毁了,有这种情况出现吗?这时数据能传过去吗?
@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就不存在了。
@爱编程的大叔: 谢谢啊,受益匪浅,我尝试下
建立DBContext是一个比较消耗时间的事情,所以如果想减少每次建立连接所消耗的这段时间,(其实这个时间对大部份人来说,不长,对于性能狂来说,例外)
-----------------------------------------------------------
偶然看到,不敢苟同,
1 DbContext是一个非常轻量级的东西。MS的建议是即用即抛。
2 如果做Web开发的话可以用DI给它缓存起来,但是要InstancePerHttpRequest,这样可以一定程度上加快访问,比如说,你是用DbSet的Find,如果已经Find过一次的时候,第二次Find是直接从内存加载的。
3 绝不建议全局个DbContext,或者跨HttpRequest的DbContext(除非你是Winform的使用场景,单机,单用户),因为会有并发问题。