94

For Asp.net Core apps, which one do we have to use? AddDbContext or AddDbContextPool? According to EF Core documentation, AddDbContextPool provides high performance but the default Asp.net Core project templates use AddDbContext.

3
  • 13
    Unless you have needs for high performance, you won't need AddDbContextPool. High-performance means 2000-5000 requests (per machine you are running your apps on) per second. 100 requests / min is no high performance and you are good with the defaults Commented Jan 25, 2018 at 14:32
  • 1
    @Tseng How about practically? - @Gabriel's answer mentions having to create new DbContext for parallel queries - will AddDbContextPool be simpler since it does this automatically? Any downsides? Commented Aug 8, 2019 at 8:32
  • @Jeppe I'm a little late, but pooling won't help you at all with parallel queries. Whether you use pooling or not, you're still only given one DbContext per scope from dependency injection. Commented Aug 19, 2020 at 9:51

1 Answer 1

142

The answer is here (under "DbContext pooling"): https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#dbcontext-pooling

DbContext is not thread-safe. So you cannot reuse the same DbContext object for multiple queries at the same time (weird things happen). The usual solution for this has been to just create a new DbContext object each time you need one. That's what AddDbContext does.

However, there is nothing wrong with reusing a DbContext object after a previous query has already completed. That's what AddDbContextPool does. It keeps multiple DbContext objects alive and gives you an unused one rather than creating a new one each time.

Which one you use is up to you. Both will work. Pooling has some performance gains. However the documentation warns that if you use any private properties in your DbContext class that should not be shared between queries, then you should not use it. I imagine that's pretty rare though, so pooling should be appropriate in most cases.

Sign up to request clarification or add additional context in comments.

11 Comments

But, and what about sql transations? if transations scope is per connection, in the pool of connection is could be affected?
The default transaction behavior is that it creates a transaction for each call to SaveChanges() and closes it automatically. So it only might be an issue if you create a transaction manually and don't close it off.
Will returned DbContext keep their underlying connection alive whilst being pooled? I can't seem to find any clue in the docs.
@djsoteric If you are handling the resetting of that property, then yes, you will be fine as long as you are resetting it properly when needed.
Internals: When a DbContext is returned to the context pool, the state of the context is being reset by calling its IResettableService.ResetState() method. This method in turn calls the GetResettableServices() method and then calls IResettableService.ResetState() on the returned objects as well. One of those objects is the EF Core providers RelationalConnection derived object, because it implements IResettableService as well. The default implementation of ResetState() in RelationalConnection is to call its own Dispose() method, which in turn calls DbConnection.Dispose().
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.