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

Node.js pg连接Postgres服务重启后出现多会话问题咨询

问题原因

  • 旧连接未主动销毁:每次重连时你直接重新实例化pg.Client并覆盖全局client变量,但之前出错的旧连接没有调用end()方法主动销毁,旧连接的事件监听也没有移除,仍可能在后台触发逻辑、占用数据库连接数。
  • 重连逻辑重复触发:你同时在client.on('error')事件和client.connect的错误回调中都写了重连逻辑,当Postgres宕机时两个逻辑会同时触发,导致同一时间多次调用postgresDBConnect,批量创建多个新连接。
  • 连接数限制未生效:你定义的max:1是pg.Pool的专属配置,但你全程使用的是无连接数限制的pg.Client,该参数完全没有生效,无法限制客户端创建的连接数量。

修复方案

  • 新增旧连接清理逻辑:在postgresDBConnect函数最开头先判断是否存在旧的client实例,如果存在则先调用client.end()关闭旧连接,同时移除旧实例的所有事件监听,避免残留逻辑触发。
  • 加锁避免重连重入:新增isReconnecting全局标记,只要已经触发了一次重连逻辑、有未执行的重连定时器,就不再响应新的重连请求,避免重复创建连接。
  • 推荐直接使用pg.Pool替代自行实现的单客户端重连逻辑:pg.Pool自带连接管理、自动重连能力,你已经写好了Pool的配置参数,直接实例化new pg.Pool(pool)即可,max:1配置会自动生效,全程只会保留最多1个有效连接,不需要自己维护重连逻辑。
  • 额外优化:你当前的SQL是直接字符串拼接参数,存在严重SQL注入风险,建议改成pg的参数化查询写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:06:04