NodeJS使用oracledb连接池触发NJS-003无效连接错误如何解决?
问题根因
你当前代码中的connection、result变量未声明块级/函数作用域,默认挂载到全局作用域共享。当连续发起两次请求时,后调用的路由B会覆盖全局的connection变量值,路由B执行完毕调用connection.close()时,实际关闭的是已经被覆盖的、路由A正在使用的连接实例,最终触发NJS-003: invalid connection错误。
可行解决方案
- 优先修复变量作用域问题:在
connection和result前添加作用域声明关键字,限定变量仅在当前函数调用的上下文内生效,避免多请求互相覆盖变量 - 优化连接池基础配置:初始化连接池时配置合理的
poolMin、poolMax参数,根据服务并发量设置最大连接数,确保不同请求可以独立获取连接不会出现资源争抢 - 增加连接健康校验:执行查询前调用
connection.isHealthy()方法校验连接有效性,若连接失效则重新从连接池获取新连接
修正后的代码
async function DBGetData(req, res, query, params = {}) { let connection; // 函数作用域变量,每次调用独立不共享 let result; try { connection = await oracledb.getConnection(); connection.callTimeout = 10 * 1000; // 可选增加健康校验逻辑,进一步降低连接失效概率 if (!connection.isHealthy()) { await connection.close(); connection = await oracledb.getConnection(); } result = await connection.execute( query, params, { outFormat: oracledb.OUT_FORMAT_OBJECT, } ); // send query result res.json({ status: res.statusCode, length: result.rows.length, results: result.rows, }); } catch (err) { return res.status(400).json({ error: err.toString() }); } finally { if (connection) { // 仅关闭当前函数上下文内的独立连接,不会影响其他请求的连接 await connection.close(); } } }
内容的提问来源于stack exchange,提问作者Aldi Ginantara
相关产品推荐
相关产品推荐

