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>();