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

连接池连接数不足100仍出现SQL Connection Timeout问题求助

解决SQL Server连接池超时问题的排查步骤
  • 检查连接池的最大大小配置
    不要依赖默认值,直接查看REST服务的数据库连接字符串,确认Max Pool Size参数设置。默认值是100,但如果被修改为较小数值(比如5),即使SQL Server端只有5个休眠连接,也会把连接池占满。示例连接字符串:Server=xxx;Database=xxx;User Id=xxx;Password=xxx;Max Pool Size=50;

  • 彻底排查连接泄漏
    即使你认为异常时会关闭连接,也可能存在隐性泄漏:

    • 确保所有数据库连接都用using语句包裹,自动释放连接回池,避免异常导致连接未关闭:
      // 正确写法
      using (SqlConnection conn = new SqlConnection(connString))
      {
          conn.Open();
          // 执行数据读写操作
      } // 自动关闭并释放连接
      
    • 检查异步代码:使用async/await时,必须确保OpenAsync()、ExecuteAsync()等操作都正确await,防止连接被意外持有。
  • 区分客户端连接池和SQL Server端连接
    sp_who/sp_who2显示的是SQL Server端的连接状态,但连接池是REST服务进程(客户端)维护的。客户端池中的连接可能还未被SQL Server标记为休眠,或者客户端没有正确把连接归还到池。可以通过以下方式查看客户端实际连接数:

    • 用Windows任务管理器查看REST服务进程的句柄数
    • 用.NET性能计数器:.NET Data Provider for SqlServer -> Number of Pooled Connections
  • 检查最小连接池大小配置
    如果连接字符串设置了Min Pool Size,客户端会长期保持这些连接打开,即使没有业务请求也会占用池资源。如果低峰期不需要这么多连接,建议调低该值甚至设为0。

  • 排查活跃连接的占用情况
    sp_who显示的休眠连接不代表所有池连接都空闲,可能存在活跃的长事务或慢查询连接占用池资源。执行以下SQL查看活跃连接:

    SELECT r.session_id, r.status, r.command, s.program_name, s.host_name
    FROM sys.dm_exec_requests r
    JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
    WHERE r.status != 'sleeping';
    

    这些连接可能因阻塞、慢查询长时间占用,无法回到池被复用。

  • 重启REST服务验证
    如果客户端连接池出现异常状态(比如内存泄漏导致连接无法复用),重启服务可以清空连接池,临时解决问题的同时,验证是否是客户端进程的池管理异常。

  • 临时禁用连接池做验证
    在连接字符串中添加Pooling=false,禁用连接池后运行服务。如果不再出现超时,说明问题确实出在连接池管理上,回到前面的步骤排查泄漏或配置问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:32:38