Course contentsShow
← C#
Lesson 1086 of 1,90810. Entity Framework Core ModelingFree lesson

DbContext Pooling

Optimize resource allocation by reusing DbContext instances in multi-threaded applications.

In this lesson, you will learn how to optimize your application’s memory and performance by reusing DbContext instances through DbContext Pooling.

The Overhead Problem

By default, every time you inject a DbContext into a controller or service, Entity Framework Core creates a new instance. Creating an instance is expensive because it involves setting up internal services, configuring the model, and initializing change trackers. In high-traffic web applications, this constant "create-and-dispose" cycle puts significant pressure on the Garbage Collector (GC) and consumes CPU cycles unnecessarily.

How Pooling Works

Instead of destroying the DbContext when you call Dispose(), DbContext Pooling puts the instance into a "pool." When a new request arrives that needs a context, EF Core checks the pool. If an available instance exists, it resets the context’s state and hands it to you immediately, bypassing the expensive initialization process.

Implementation

You enable this feature in your Program.cs or Startup.cs during dependency injection registration. Simply swap AddDbContext for AddDbContextPool:

// Instead of services.AddDbContext<MyDbContext>(...)
builder.Services.AddDbContextPool<MyDbContext>(options =>
    options.UseSqlServer(connectionString));

Important Considerations

When using pooling, you must be aware of two critical limitations:

  1. Resetting State: Because the context is reused, the internal state (like the ChangeTracker) is reset between uses. You cannot store custom state in a field within your DbContext class, as that data will persist into the next request, leading to dangerous bugs.
  2. Limited Customization: You cannot use services that have a shorter lifetime (like Scoped services) inside the DbContext constructor, as the pooled context is technically a singleton-style object managed by the pool.

By implementing pooling, you reduce the allocation of short-lived objects, resulting in fewer GC pauses and faster response times for your API endpoints.

Key Takeaway: DbContext Pooling improves performance by recycling context instances, effectively reducing the overhead of object instantiation and garbage collection in high-traffic applications.