在Asp.net Core应用程序中,我们应该使用哪一个?是“AddDbContext”还是“AddDbContextPool”?根据EF Core文档,“AddDbContextPool”提供了高性能,但默认的Asp.net Core项目模板使用“AddDbContext”。请注意,这里不要改变原始意思,只需确认译文是否准确无误即可。
DbContext
不是线程安全的。因此,您不能同时为多个查询重用相同的 DbContext
对象(会出现奇怪的问题)。通常的解决方案是每次需要时创建一个新的 DbContext
对象,这就是 AddDbContext
的作用。DbContext
对象并不会有什么问题,只要先前的查询已经完成即可。这就是 AddDbContextPool
的作用。它保持多个 DbContext
对象处于活动状态,并提供一个未使用过的对象,而不是每次都创建一个新的对象。DbContext
类中存在任何不应该在查询之间共享的私有属性,则不应该使用它。不过我想这种情况可能很少见,所以在大多数情况下,池化应该是适当的。SaveChanges()
都会创建一个事务并自动关闭它。因此,只有在手动创建事务并未关闭时才可能出现问题。 - Gabriel LuciDbContext
被返回到上下文池时,通过调用其 IResettableService.ResetState()
方法来重置上下文的状态。这个方法又调用了 GetResettableServices()
方法,然后也在返回的对象上调用了 IResettableService.ResetState()
方法。其中之一就是 EF Core 提供程序的派生对象 RelationalConnection
,因为它同样实现了 IResettableService
接口。RelationalConnection
中 ResetState()
的默认实现是调用自己的 Dispose()
方法,该方法再调用 DbConnection.Dispose()
。 - lauxjpn
AddDbContextPool
。高性能意味着每秒(在您运行应用程序的机器上)2000-5000个请求。100个请求/分钟不是高性能,使用默认设置即可。 - TsengDbContext
- 使用AddDbContextPool
是否会更简单,因为它可以自动完成这个过程?有什么缺点吗? - JeppeDbContext
。 - Gabriel Luci