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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:04