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

如何在Windows C/C++环境下保持Azure SQL Server ODBC空闲连接存活

问题根因说明

  1. ODBC Driver 17 for SQL Server的KeepAlive、KeepAliveInterval连接字符串参数仅支持Linux/macOS平台,Windows平台下驱动会直接忽略这两个参数,走Windows系统TCP栈的全局保活配置。
  2. Azure SQL网关默认会主动断开空闲时长超过20分钟、无任何流量的TCP连接,这是公有云网关的通用资源回收策略,和数据库本身配置无关。你测试时持续有流量读取游标不会触发断开,也验证了这一点。
  3. 你读取到的ConnectionRetryCount参数始终为1,是因为连接字符串里的参数名拼写错误:正确参数名为ConnectRetryCount,你多写了ion后缀,驱动识别不到就会采用默认值1。另外这个参数仅作用于连接建立阶段的重连逻辑,和空闲连接保活、断开后重连无关。

可行解决方案

方案1:应用层实现心跳(最推荐,兼容性最高)

不需要依赖驱动、系统配置,跨平台通用,实现成本极低:

  • 程序内启动一个低优先级后台线程,每隔10~15分钟(小于20分钟的断开阈值即可)给所有存活的空闲数据库连接执行一次轻量查询,比如SELECT 1
  • 可以同步在心跳逻辑里处理连接失效的情况,发现连接断开后主动重建,完全对上层业务逻辑透明,效果和PostgreSQL的驱动层KeepAlive完全一致。

方案2:修改Windows系统TCP保活配置(无需改代码)

如果不想调整现有业务代码,可以通过修改Windows注册表实现全局TCP保活:

  1. 按下Win+R输入regedit打开注册表编辑器,定位到路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  2. 新建两个DWORD(32位)值:
    • KeepAliveTime:值设为900000(单位为毫秒,对应15分钟,保活报文发送间隔小于Azure的20分钟断开阈值)
    • KeepAliveInterval:值设为10000(单位为毫秒,对应10秒,无响应时重发保活报文的间隔)
  3. 重启系统后配置生效,所有TCP连接都会自动启用该保活策略。

方案3:开启ODBC驱动自动连接恢复功能

ODBC Driver 17.2及以上版本支持连接自动恢复特性,连接断开后驱动会在你下一次调用ODBC接口时自动尝试重连,上层仅需做少量兼容处理:

  • 调用SQLDriverConnect成功后,通过SQLSetConnectAttr设置SQL_COPT_SS_DBC_RECOVERY属性为SQL_ON开启自动恢复
  • 业务逻辑执行SQL操作时,捕获返回的08S02(连接已断开,正在重连)状态码,等待重连完成后重试操作即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:15:10