You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL Server监控应用状态并在崩溃时更新状态

基于心跳机制的应用状态监控方案(适配SQL Server)

一、核心思路

你之前考虑的心跳(Ping)机制是最直接的落地方案,核心逻辑:应用定期向SQL Server发送状态更新(心跳包),SQL Server通过检测心跳的时效性判断应用是否崩溃,自动更新状态表。

二、具体实现步骤

1. 创建状态监控表

先在SQL Server中创建存储应用状态的表,包含核心标识与状态字段:

CREATE TABLE AppMonitor (
    AppID VARCHAR(50) PRIMARY KEY, -- 唯一标识单应用
    AppName VARCHAR(100) NOT NULL,
    LastHeartbeat DATETIME NOT NULL,
    Status VARCHAR(20) NOT NULL DEFAULT 'Running' -- 状态可选值:Running/Offline/Crashed
);
-- 提前插入需要监控的应用记录
INSERT INTO AppMonitor (AppID, AppName, LastHeartbeat)
VALUES ('APP001', '订单处理系统', GETDATE());

2. 应用端实现心跳发送

在你的应用程序中,每隔固定时间(比如10秒)执行SQL语句更新心跳时间。以C#伪代码为例:

// 用Timer或调度框架实现定时任务
private void SendHeartbeat()
{
    try
    {
        using (var conn = new SqlConnection("你的SQL连接字符串"))
        {
            conn.Open();
            var cmd = new SqlCommand("UPDATE AppMonitor SET LastHeartbeat = GETDATE() WHERE AppID = @AppID", conn);
            cmd.Parameters.AddWithValue("@AppID", "APP001");
            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        // 记录心跳发送失败日志,排查网络或SQL连接问题
    }
}

其他语言(Java/Python)逻辑一致,只要定期执行UPDATE语句即可。

3. SQL Server端自动检测并更新状态

通过SQL Server代理的**作业(Job)**定期检测心跳超时:

  • 打开SQL Server代理,新建作业
  • 作业步骤中执行以下SQL脚本,设置执行间隔为15秒(略长于心跳间隔,避免网络波动误判):
-- 标记超过15秒未发心跳的应用为崩溃
UPDATE AppMonitor
SET Status = 'Crashed'
WHERE LastHeartbeat < DATEADD(SECOND, -15, GETDATE()) 
  AND Status != 'Crashed';

-- 应用恢复心跳后自动改回运行状态
UPDATE AppMonitor
SET Status = 'Running'
WHERE LastHeartbeat >= DATEADD(SECOND, -15, GETDATE())
  AND Status = 'Crashed';
  • 设置作业执行计划为「重复执行」,间隔15秒,持续时间选「无限期」

三、替代方案(可选)

若不想依赖应用主动发心跳,可利用SQL Server的会话连接检测:
如果应用保持长连接,且连接字符串指定了Application Name,可通过系统视图判断连接是否存在:

UPDATE AppMonitor
SET Status = CASE 
               WHEN EXISTS (SELECT 1 FROM sys.dm_exec_sessions 
                            WHERE program_name = '订单处理系统' -- 对应连接字符串的Application Name
                              AND host_name = '应用所在服务器名')
               THEN 'Running'
               ELSE 'Crashed'
             END
WHERE AppID = 'APP001';

该方案依赖应用长连接,灵活性不如心跳机制,仅作补充参考。

内容的提问来源于stack exchange,提问作者Teggun7565

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:50:35