【问题标题】: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);
    }
}

【问题讨论】:

标签: .net entity-framework entity-framework-6


【解决方案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 请求,它仍然是一个很大的优势。参见例如stackoverflow.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

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

【讨论】:

  • 这与并行处理无关,因此这里不提。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2012-08-02
  • 2013-05-23
相关资源
最近更新 更多