【问题标题】:asp.net mvc too many queries on one page entity framework parallel?asp.net mvc 一页实体框架并行查询太多?
【发布时间】:2017-08-26 21:46:37
【问题描述】:

我正在使用 asp.net mvc 5 构建一个网站。

目前我正在使用依赖注入将每个请求的 dbcontext 注入到我的控制器中。

但 EF 不是线程安全的,因此一个 dbcontext 不能用于并行查询。

是否值得对我的网站进行更改,让这个页面像这样使用 smt?

using(var ctx = new dbcontext) {
    //creating a task query like tolistasync
}

using(var ctx2 = new dbcontext) {
    //creating a task query like tolistasync
}

using(var ctx3 = new dbcontext) {
    //creating a task query like tolistasync
}
.
.
.
.
.
.
.
using(var ctx20 = new dbcontext) {
    //creating a task query like tolistasync
}

然后:

 Task.WhenAll(t1,t2,t3,......,t20)

或者我应该对每个请求只使用一个 dbcontext 并执行以下操作:

 var query1result = await query1.ToListAsync();
 var query2result = await query2.ToListAsync();
 var query3result = await query3.ToListAsync();
 var query4result = await query4.ToListAsync();
 .
 .
 .
 .
 .
 var query19Result = await query19.ToListAsync();
 var query20Result = await query20.ToListAsync();

在第一种情况下,与 db 的打开和关闭连接会非常多。

第二个会有一个连接,但一切都是按顺序发生的

哪种情况更好,为什么?

【问题讨论】:

  • 如果您将上下文包装在 using 中,我认为它们中的任何一个都不会起作用,因为这将在异步任务完成之前关闭连接。
  • 我知道我这样做只是为了澄清问题

标签: c# asp.net-mvc entity-framework task-parallel-library


【解决方案1】:

但 EF 不是线程安全的,因此一个 dbcontext 不能用于并行查询。

“线程安全”与“支持多个并发操作”完全不同。

是否值得对我的网站进行更改,让这个页面像这样使用 smt?

哪种情况更好,为什么?

只有你能回答这个问题。

但是,有一些一般性指导。

首先,对数据库的操作通常是 I/O 密集型的,而不是 CPU 密集型的。请注意,这条规则有很多例外。

其次,如果所有/大部分操作都针对同一个数据库,那么文件级别肯定会发生争用。

第三,如果数据库位于传统(即非固态)硬盘驱动器上,则磁盘盘片级别的争用会更多。

所以,所有这一切都是说如果您的后端只是一个普通的 SQL Server,那么您可能看不到并发数据库操作的任何好处(即更快的响应时间)服务器处于正常负载状态。事实上,在这种情况下,您可能根本看不到异步数据库调用的任何好处(与同步调用相比)。

但是,如果您的后端更现代,例如 Azure SQL 实例(尤其是在 SSD 上运行的实例),那么并发数据库操作确实可以加快您的请求。

【讨论】:

    【解决方案2】:

    如果您确实需要处理大量查询,您可以并行运行它们。我会使用Parallel.ForEach

    【讨论】:

      【解决方案3】:

      首先,问问自己——你真的有性能问题吗?如果没有 - 像往常一样 - 在一个 DbContext 中。这是最简单且非常安全的方法。

      如果你有问题?让我们试试吧:

      如果您的查询是只读的,您可以并行运行多个线程。创建新的DbContext 并打开新的连接——这不是一个大问题。此外,您可以使用AsNoTracking 调用所有只读查询。因此,EF 不会在上下文中缓存实体。

      但是,三思而后行。在并行执行代码中调试和发现问题更加困难。所以,你的操作一定很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多