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

使用node-oracledb 6 Thin模式时Node.js脚本结束为何停顿?

node-oracledb 6.0 Thin模式下未关闭连接导致脚本终止延迟的原因

问题场景

使用node-oracledb 6.0默认的Thin模式运行Node.js脚本时,若未显式关闭数据库连接,脚本终止前会出现几秒延迟/停顿;添加connection.close()语句后,延迟完全消失。而在早期node-oracledb版本中,无论是否关闭连接都不会出现此类延迟。

测试脚本

const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');

async function runApp() {

  const connection = await oracledb.getConnection(dbConfig);
  const result = await connection.execute(`select * from dual`);
  console.dir(result.rows, { depth: null });
  console.log('not closing connection');
  // console.log('closing connection');
  // await connection.close();
}

runApp();

延迟对比测试结果

在Linux机器上使用time命令测试的结果如下:

$ time node t.js
[ [ 'X' ] ]
closing connection

real    0m0.249s
user    0m0.082s
sys 0m0.017s

$ time node t.js
[ [ 'X' ] ]
not closing connection

real    0m8.187s
user    0m0.092s
sys 0m0.017s

原因分析

node-oracledb 6.0的Thin模式对连接生命周期管理逻辑做了针对性调整:

  • 若未显式调用connection.close(),Node.js进程不会主动向Oracle数据库发送断开请求,此时Oracle端会触发自身的连接超时回收机制,等待约8秒(时长由数据库端超时配置决定)后才主动断开连接,这段等待时间就表现为脚本终止前的延迟。
  • 早期版本的node-oracledb(包括基于Thick模式的版本或旧版Thin模式)在进程退出时,会强制销毁未关闭的连接资源,无需等待数据库端的超时回收流程,因此不会出现延迟。
  • 显式调用connection.close()会立即主动向数据库发送断开请求,直接释放连接资源,进程可以快速退出,因此延迟消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:12:52