PostgreSQL pg库调用pool.end()报错,pool.end()的正确使用时机是什么?
报错原因
你的代码中pool.query采用异步回调执行模式,同层级的pool.end()会在查询请求发出后立刻执行,不等数据库返回结果、也不等回调函数触发,就直接销毁了整个连接池的所有连接。等数据库响应返回时,连接已经被关闭,回调无法拿到正常的results返回对象,就会触发你遇到的Cannot read property 'rows' of undefined报错。
pool.end()的正确使用时机
连接池的核心作用是复用数据库连接,避免频繁创建销毁连接的性能损耗,本身就是为长期运行的服务设计的:
- 常规Web服务场景下,你只需要在服务启动时初始化一次连接池,服务运行全程不需要主动调用
pool.end(),连接池会自动管理连接的复用、空闲释放逻辑。 - 只有确认后续不会再产生任何数据库查询请求时,才需要调用
pool.end(),常见场景只有两类:- 一次性运行的脚本任务,所有数据库操作都执行完毕、准备退出进程前
- 服务收到停机信号,准备做优雅退出前
注意:不要在任何接口请求的处理逻辑中调用
pool.end(),一旦连接池被关闭,后续的所有请求都无法正常获取数据库连接。
代码修正方案
你当前的Express服务场景完全不需要在接口请求逻辑里加pool.end(),直接删除注释的那行代码即可,连接池会自动处理后续所有请求的数据库连接需求。
如果需要做服务优雅停机,可以额外加一段进程信号监听逻辑,在服务退出前再关闭连接池:
// 监听进程终止信号,优雅关闭数据库连接池 process.on('SIGINT', async () => { await pool.end() console.log('数据库连接池已正常关闭,服务退出') process.exit(0) })
内容的提问来源于stack exchange,提问作者supmethods
相关产品推荐
相关产品推荐

