为什么在使用node-oracledb 6精简模式时,Node.js脚本末尾会出现暂停?

lmyy7pcs  于 2023-06-05  发布在  Oracle
关注(0)|答案(1)|浏览(299)

当我在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版本中没有看到这种延迟,无论我是否关闭连接。是什么原因呢?

p8ekf7hl

p8ekf7hl1#

node-oracledb 6.0的精简模式下会出现此行为。这是由于打开的连接引用需要由垃圾收集器清理。
在node-oracledb 6. 0的精简模式下,事件循环知道套接字,并将保持应用程序运行,直到这些套接字关闭。在内部有一个终结注册表,当保存这些套接字的对象被垃圾回收时,它强制关闭这些套接字。但是,在密集模式或早期的node-oracledb版本中,套接字由Oracle Client库保存。因此,Node.js并不关注它们,并且很乐意在它们仍然打开的情况下终止!

相关问题