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 进行审计跟踪