Entity Framework 是不是支持并行异步查询? [复制]

Posted

技术标签:

【中文标题】Entity Framework 是不是支持并行异步查询? [复制]【英文标题】:Does Entity Framework support parallel async queries? [duplicate]Entity Framework 是否支持并行异步查询? [复制] 【发布时间】:2014-07-11 16:15:11 【问题描述】:

当我们启动多个异步实体框架查询并并行运行它们时会发生什么?

它们是否在物理上并行执行?它们是否由实体框架序列化?这是不受支持的吗?会不会导致异常?

public async Task QueryDatabase()

    using (var context = new MyDbContext())
    
        Task task1 = context.SomeTable1.ToListAsync();
        Task task2 = context.SomeTable2.ToListAsync();

        await Task.WhenAll(task1, task2);
    

【问题讨论】:

见***.com/questions/41749896/… 【参考方案1】:

specifications of version 6 不支持此功能。

这应该抛出一个DbConcurrencyException 异常提示

第二个操作在前一个上下文之前开始 异步操作完成。使用“等待”确保任何 异步操作在调用另一个方法之前已经完成 在这种情况下。不保证任何实例成员都是线程 安全。

EF 将检测开发者是否尝试一次执行两个异步操作并抛出

来自a codeplex page of the project:

启用异步执行数据库操作其实就是 正交于在同一上下文上启用并发执行。在 服务器场景的特殊情况,使用并发访问可以 对可扩展性产生负面影响,因为这意味着为了 处理您将旋转任意数字的单个请求 不同的线程。所有线程都会竞争资源,例如 作为与其他线程一起服务其他并发所需的内存 请求。

实体框架核心does not support this scenario either。

EF Core 不支持在同一个上下文实例上运行多个并行操作。在开始下一个操作之前,您应该始终等待操作完成。这通常通过在每个异步操作上使用 await 关键字来完成。

【讨论】:

赞成准确性,尽管我希望我可以反对编写 Codeplex sn-p 的人。一个好的查询几乎完全是对数据​​库的打击,在大多数情况下是多 CPU 并且在许多情况下是联网的。向数据库抛出一堆并行异步调用不使用线程! blog.stephencleary.com/2013/11/there-is-no-thread.html 如果所有查询都是 .AsNoTracking(),EF 支持这一点应该是微不足道的,但它仍然会抛出这个异常。 @ChrisMoschini 我很确定最后一句话不是指 EF,而是指 SQL Server。 @ErikPhilips 不确定你的意思,你能澄清一下吗? @MIKE 嗯,它异步的;只是你不能并行运行多个异步 SQL 操作。异步编程在服务器端有多个优点:首先是没有更好的性能,它是可扩展性,这意味着您不会阻塞线程直到操作完成。即使你不能并行运行两个 SQL 请求,它仍然是一个很大的优势。参见例如***.com/a/12673868 @ChrisPratt 在 EF6 中,甚至查询也无法并行运行。您只是不能同时启动多个异步操作(get、count、update、delete、insert...)。【参考方案2】:

请注意,正如 ken2k 所提到的,在将实体框架与 MS SQL Server 一起使用时,这是不允许的。但是,如果您将实体框架与 Oracle 一起使用,则允许这样做。

【讨论】:

你能提供一个来源吗?我的印象是 EF 内部无法同时运行多个查询。这将要求其内部结构(例如身份映射)是线程安全的。 我无法提供来源,我只能说我在生产环境中运行的代码使用了该方法。 手指越过您的寻呼机不会在晚上响起。感谢您报告此事。 上下文不是线程安全的,永远不会。数据库提供者没有任何影响。这显然是错误的信息。【参考方案3】:

只是想用 EF 5 更新它,现在可以拆分在单独的查询中加载导航属性的查询: https://docs.microsoft.com/en-us/ef/core/querying/single-split-queries

仍然无法解决您的问题,但可能对您有所帮助。

【讨论】:

这与并行处理无关,因此这里不提。

以上是关于Entity Framework 是不是支持并行异步查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended

在Oracle中使用Entity Framework 6 CodeFirst

Entity Framework Extended Library (EF扩展类库,支持批量更新删除合并多个查询等)

使用 Entity Framework Core 进行审计跟踪

Entity Framework 7 支持批量操作和 JSON 列

Entity Framework 4 表值函数