在.NET Core EF core中并行调用dbcontext。

问题描述 投票:1回答:1

项目使用。

  • SQL Server
  • .NET核心3
  • EF核心

在我的项目中,我有几百万条数据记录,我需要在一个API中从4个不同的表中进行并行读取请求。DBContext 如同推荐的那样,它有一个范围化的寿命。我需要并行调用 DBContext但当我尝试时,它说第二个实例已经启动,而一个实例已经在使用中(因为寿命是有范围的)。

  • 我试着用 AsNoTracking() 但还是一样的错误。
  • 我不能使用短暂的Lifetime。
  • 项目使用仓库模式,不能使用新的 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
});

我需要优化我的代码以使响应时间更好。

  1. 有什么方法可以让我运行并行查询(只读)?
  2. DbContext 有什么方法可以让我运行并行读取查询(只读)?
  3. 一次获取30000条记录需要多少时间(当我使用所有索引时)?如何减少时间,对我来说,加载数据需要2分钟?
sql-server multithreading asp.net-core task-parallel-library ef-core-3.0
1个回答
1
投票

DbContext不是线程安全的,一个实例不能对一个实例进行条目更新,但为什么我不能进行并行读取查询?

因为DbContext不是Tthread安全的。PERIOD.因为DbContext不是Tthread安全的。不是 "updatecreate"--完全不是。很大程度上运行下来,最后在一个DbConnection上没有假设的并行SQL语句,MARS并没有改变这一点--它允许重叠查询结果,不允许重叠查询执行。

一次得到30000条记录预计需要多少时间(当我使用所有的索引时)?

索引。与对象的大小和网络连接关系不大。上次我在半秒内完成了50万条条目--但这些条目都很小,而且网络连接速度非常快。

有什么方法可以让我运行并行查询(只读)?

是的,多个db连接,多个dbContexts。

© www.soinside.com 2019 - 2024. All rights reserved.