项目使用。
在我的项目中,我有几百万条数据记录,我需要在一个API中从4个不同的表中进行并行读取请求。DBContext
如同推荐的那样,它有一个范围化的寿命。我需要并行调用 DBContext
但当我尝试时,它说第二个实例已经启动,而一个实例已经在使用中(因为寿命是有范围的)。
AsNoTracking()
但还是一样的错误。项目使用仓库模式,不能使用新的 DBcontext
控制器中的实例。
public MemberRepository(
IMemberEntityMappingHelper memberEntityMappingHelper,
IMapperExtension mapper,
ProjectDBContext context)
: base(context, mapper)
{
_memberEntityMappingHelper = memberEntityMappingHelper;
}
public List<MemberSummaryModel> GetMembers(int foreignKeyId)
{
List<MemberEntity> members = _context.Members
.Include(x => x.Sample)
.Where(x =>
x.SampleForeignkeyId == foreignKeyId
&& x.IsDeleted == false)
.ToList();
return _memberEntityMappingHelper.EntityToSummaryModelList(members);
}
并行调用 -
Parallel.Invoke(() =>
{
// Read from table 1
},
() =>
{
// Read from table 2
});
我需要优化我的代码以使响应时间更好。
DbContext
有什么方法可以让我运行并行读取查询(只读)?DbContext不是线程安全的,一个实例不能对一个实例进行条目更新,但为什么我不能进行并行读取查询?
因为DbContext不是Tthread安全的。PERIOD.因为DbContext不是Tthread安全的。不是 "updatecreate"--完全不是。很大程度上运行下来,最后在一个DbConnection上没有假设的并行SQL语句,MARS并没有改变这一点--它允许重叠查询结果,不允许重叠查询执行。
一次得到30000条记录预计需要多少时间(当我使用所有的索引时)?
索引。与对象的大小和网络连接关系不大。上次我在半秒内完成了50万条条目--但这些条目都很小,而且网络连接速度非常快。
有什么方法可以让我运行并行查询(只读)?
是的,多个db连接,多个dbContexts。