DbContext Pool Performance Monitoring

public class DbContextMonitor
{
    private readonly ILogger<DbContextMonitor> _logger;

    public DbContextMonitor(ILogger<DbContextMonitor> logger)
    {
        _logger = logger;
    }

    public void LogPoolStats(DbContext context)
    {
        var statistics = context.Database.GetService<IDbContextPoolable>();
        if (statistics != null)
        {
            _logger.LogInformation(
                "Pool Size: {PoolSize}, Available: {Available}",
                statistics.MaxPoolSize,
                statistics.AvailableContexts
            );
        }
    }
}


Create a Background Service

public class DbContextMonitoringService : BackgroundService
{
    private readonly IServiceProvider _serviceProvider;
    private readonly ILogger<DbContextMonitoringService> _logger;
    private readonly TimeSpan _interval = TimeSpan.FromMinutes(1); // Adjust as needed


    public DbContextMonitoringService(IServiceProvider serviceProvider, ILogger<DbContextMonitoringService> logger)
    {
        _serviceProvider = serviceProvider;
        _logger = logger;
    }


    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService<YourDbContext>();
                var monitor = scope.ServiceProvider.GetRequiredService<DbContextMonitor>();
                monitor.LogPoolStats(context);
            }


            await Task.Delay(_interval, stoppingToken);
        }
    }
}


Register it in Program.cs

builder.Services.AddHostedService<DbContextMonitoringService>(); 
builder.Services.AddSingleton<DbContextMonitor>();