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(这是一个非常快速的操作)。这里发生了什么?是否每次都尝试重新连接到数据库?
答案 0 :(得分:0)
您正在使用AddDbContext方法,对于您在第一个场景中使用的DbContext,它将DbContext作为Scoped添加到服务中(如果我没有记错)。一旦添加服务,DbContext可能会因为优化而被初始化(这里不确定)。对于第二种情况,您要创建一个新的DbContext。除了创建DbContext之外,还有一些其他的东西需要完成。
摘自this post,这里有一些提示,以便进行预热&#39;你的背景:
上述提示表明,使用DbContext比使用DbContext还要多。新手并开始查询。