当我在node-oracledb 6.0的默认“Thin”模式下运行下面的Node.js脚本时,我看到在它最终终止之前有几秒钟的延迟/暂停。
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();
请注意,这里我没有显式关闭连接。当我包含connection.close()
时,暂停/延迟消失。
为了在关闭/不关闭连接的情况下演示这个问题,我在我的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版本中没有看到这种延迟,无论我是否关闭连接。是什么原因呢?
1条答案
按热度按时间p8ekf7hl1#
node-oracledb 6.0的精简模式下会出现此行为。这是由于打开的连接引用需要由垃圾收集器清理。
在node-oracledb 6. 0的精简模式下,事件循环知道套接字,并将保持应用程序运行,直到这些套接字关闭。在内部有一个终结注册表,当保存这些套接字的对象被垃圾回收时,它强制关闭这些套接字。但是,在密集模式或早期的node-oracledb版本中,套接字由Oracle Client库保存。因此,Node.js并不关注它们,并且很乐意在它们仍然打开的情况下终止!