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