使用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
相关产品推荐
相关产品推荐

