Node.js对接PostgreSQL接口调用10次后Postman请求延迟或无响应求助
问题原因
- 核心问题是数据库连接使用后未释放:PostgreSQL 默认连接池的最大连接数通常为 10,你的代码中每次请求都通过
db.connectDatabase()获取了一个数据库客户端连接,但完成查询逻辑后没有将连接释放回连接池,10 次请求后连接池被完全占满,后续请求只能阻塞等待空闲连接,就出现了响应极慢或者无响应的情况。 - 额外隐患:现有异常捕获逻辑仅将错误抛出,没有处理错误场景下的连接释放,就算补充了正常流程的释放逻辑,请求报错时连接依然会泄漏。
解决方案
- 新增
finally代码块,保证无论请求正常执行还是报错,都能把连接释放回连接池,同时优化异常场景的响应逻辑,避免前端收不到错误提示。 - 修正后的代码示例:
var db = require('../config/dbConfig') var sendResp = require('../helper/response').sendRsp; module.exports.saveSubscriberDetail = async (req,res) => { let objDetailsInput = Object.assign({}, common.detailsInput); errors = [] let finalData; objDetailsInput = req.body; var reqObj = {}; var client = null; try { client = await db.connectDatabase(); if (objDetailsInput.subscriberDetails.p_address.country) { const rows = await client.query('SELECT * FROM country where country_code = $1', [objDetailsInput.country]) if(rows) { sendRsp(res,201,"Success",rows); } else { sendRsp(res,500,"Internal Server Error") } } } catch (error) { sendRsp(res, 500, "Internal Server Error", error.message) } finally { // 只要成功获取到连接,无论执行结果如何都释放 if (client) { client.release() } } };
- 可选优化:如果你的
db.connectDatabase()返回的是连接池实例,可以直接调用连接池的query方法,无需手动获取和释放连接,PG 库会自动管理连接生命周期,进一步降低泄漏风险,语法为await pool.query(查询语句, 参数)。
内容的提问来源于stack exchange,提问作者DRV
相关产品推荐
相关产品推荐

