为什么创建新的DbContext比依赖注入的DbContext慢?

时间:2017-05-29 07:53:12

标签: entity-framework asp.net-core benchmarking query-performance

I recently determined在.NET Core中使用Dependency Injected DbContext并使用异步等待调用而不是每次我想访问数据库时创建新的DbContext都没有显着的性能提升。

但现在我需要知道原因。

我在我的.NET Core 1.1 API服务(控制器正在调用)中使用System.Diagnostics.Stopwatch进行了更细粒度的测试,其中我只在访问数据库时才运行秒表。结果令人惊讶。

使用标准的Dependency Injected上下文和async / await calls:

var task1 = _InjectedDbContext.Table1.FirstOrDefaultAsync(p => p.Id == SomeId);
var task2 = _InjectedDbContext.Table2.Where(u => u.AnotherId == SomeOtherId).ToListAsync();

(var result1, var result2) = await (task1, task2).WhenAll();

每个DbContext查询花费的时间都少于100毫秒。

但是,使用此方法时:

using (var context = new DbContext(_InjectedContextOptions.Options))
{
    var task1 = context.Table1.FirstOrDefaultAsync(p => p.Id == SomeId);
    var task2 = context.Table2.Where(u => u.AnotherId == SomeOtherId).ToListAsync();

    (var result1, var result2) = await (task1, task2).WhenAll();
}

每个DbContext查询需要100到230毫秒。

仅供参考,这是我在Startup.cs ConfigureServices中的DI设置代码:

var connection = Configuration.GetConnectionString("mydb");
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connection));

以下是我创建新DbContext时将DbContextOptions作为单例提供的代码:

var dbContextOptions = new DbContextOptionsBuilder<MyDbContext>();        
dbContextOptions.UseSqlServer(Configuration.GetConnectionString("MyDb"));
services.AddSingleton(dbContextOptions);

我还确定滞后不仅仅是由于在using语句中创建DbContext(这是一个非常快速的操作)。这里发生了什么?是否每次都尝试重新连接到数据库?

1 个答案:

答案 0 :(得分:0)

您正在使用AddDbContext方法,对于您在第一个场景中使用的DbContext,它将DbContext作为Scoped添加到服务中(如果我没有记错)。一旦添加服务,DbContext可能会因为优化而被初始化(这里不确定)。对于第二种情况,您要创建一个新的DbContext。除了创建DbContext之外,还有一些其他的东西需要完成。

摘自this post,这里有一些提示,以便进行预热&#39;你的背景:

  1. 使用缓存的数据库模型商店
  2. 生成预编译的视图
  3. 使用n-gen生成实体框架的预编译版本以避免jitting
  4. 上述提示表明,使用DbContext比使用DbContext还要多。新手并开始查询。