答案:通过SqlConnection执行SELECT 1验证数据库连接健康状态。使用IHealthCheck接口实现自定义检查,结合ASP.NET Core健康检查中间件,通过轻量查询检测数据库可用性,成功返回200,失败返回503,适用于SQL Server等数据库的健康监测集成。

在C#中实现数据库连接的健康检查,通常用于确保应用程序能正常访问数据库,特别是在微服务或后台服务中配合健康监测系统(如ASP.NET Core Health Checks)使用。下面是一个简单、实用的实现方式。
使用 SqlConnection 进行数据库健康检查
以 SQL Server 为例,通过尝试打开一个数据库连接并执行一个轻量查询(如 SELECT 1)来判断数据库是否可达。
// 示例:手动检查数据库连接是否正常
using System;
using System.Data.SqlClient;
public class DatabaseHealthCheck
{
private readonly string _connectionString;
public DatabaseHealthCheck(string connectionString)
{
_connectionString = connectionString;
}
public bool IsHealthy()
{
try
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = new SqlCommand("SELECT 1", connection))
{
var result = command.ExecuteScalar();
return Convert.ToInt32(result) == 1;
}
}
}
catch (SqlException)
{
return false;
}
catch (Exception)
{
return false;
}
}
}
在 ASP.NET Core 中集成健康检查
如果你使用的是 ASP.NET Core,推荐使用内置的健康检查中间件。以下是配置方法:
// 1. 在 Program.cs 或 Startup.cs 中添加健康检查服务
// Program.cs (.NET 6+)
var builder = WebApplication.CreateBuilder(args);
// 添加健康检查服务
builder.Services.AddHealthChecks()
.AddSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
var app = builder.Build();
// 使用健康检查中间件
app.MapHealthChecks("/health");
app.Run();
这样访问 /health 路径时,系统会自动检查 SQL Server 是否可连接。如果连接失败,返回状态码 503;成功则返回 200。
自定义健康检查(IHealthCheck)
你也可以实现更灵活的自定义逻辑:
using Microsoft.Extensions.Diagnostics.HealthChecks;
using System.Data.SqlClient;
public class CustomDatabaseHealthCheck : IHealthCheck
{
private readonly string _connectionString;
public CustomDatabaseHealthCheck(string connectionString)
{
_connectionString = connectionString;
}
public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
using var connection = new SqlConnection(_connectionString);
await connection.OpenAsync(cancellationToken);
using var command = new SqlCommand("SELECT 1", connection);
var result = await command.ExecuteScalarAsync(cancellationToken);
if (Convert.ToInt32(result) == 1)
{
return HealthCheckResult.Healthy("数据库连接正常");
}
return HealthCheckResult.Unhealthy("数据库响应异常");
}
catch (Exception ex)
{
return HealthCheckResult.Unhealthy("数据库连接失败", ex);
}
}
}
注册自定义检查:
builder.Services.AddHealthChecks()
.AddCheck("database");
基本上就这些。你可以根据实际数据库类型(如 PostgreSQL、MySQL)更换对应的连接类和驱动。关键是用最小开销验证连接可用性,避免影响性能。










