为什么我的node-oracledb执行Promise稳步增加需要解决的时间?

我正在编写一个与Oracle数据库进行交互的ETL工具,该数据库也使用node-oracledb 1.10RxJS来处理我所徘徊的各种asynchronous数据stream。 我遇到了一个问题,我的应用程序运行的时间越长,调用node-oracledb.execute()花费的时间.execute() ,并且它在运行时间中线性增加。 希望你可以在下面的代码中发现错误并纠正错误。

首先让我演示如何运行Oracle查询。 我创build了自己的.execute()函数,充当node-oracledb.execute()的包装器。

 import oracledb from 'oracledb'; var oraConnPool; export function execute(sql, bind, opts) { if (!oraConnPool) { createOraPool(); } return oraConnPool .then(pool => pool.getConnection()) .then(conn => conn.execute(sql, bind, opts)); } function createOraPool() { let oraPool = oracledb.createPool(config.database.oracle); oraConnPool = oraPool; return oraPool; } 

和我的config.database.oracle (没有凭据):

 { "poolTimeout": 60, "poolMin": 10, "poolMax": 25, "queueRequests": true, "queueTimeout": 600000, "_enableStats": true } 

下面是我调用我的.execute()函数的一个例子。 正如你所看到的,这里有很多事情发生,所以为了清楚起见,让我试着对它进行一些注释。 rnd用于为console.time()创build一个唯一的ID,所以我可以跟踪.execute() Promise解决的时间。 让我知道这次测量技术是否存在缺陷。 传递给SELECT语句的绑定inputvariables是一个包含ssid标识符的csvstring,并返回匹配列表。 这使我可以批处理logging,而不是为每个单独的行创build一个查询,希望节省一些执行时间。 第一个.then()使所得到的对象数组中的每个键都是小写的。 第二个.then()显然结束了console.time()跟踪。

 const rnd = Math.random() * 100; console.time(rnd); return execute(` SELECT ssid_input.ssid AS ssid, students.id AS student_id, students.student_number AS student_number FROM ( SELECT REGEXP_SUBSTR( :ssids, '[^,]+', 1, level) AS ssid FROM dual CONNECT BY REGEXP_SUBSTR( :ssids, '[^,]+', 1, level) IS NOT NULL ) ssid_input LEFT JOIN students ON students.state_studentnumber = ssid_input.ssid`, { ssids: { val: ssids.join(','), dir: orawrap.BIND_IN, type: orawrap.STRING } }, { outFormat: orawrap.OBJECT, maxRows: ssids.length }) .then(results => { return results.rows.map(result => { let newObj = {}; Object.keys(result).forEach(key => { newObj[key.toLowerCase()] = result[key]; }); return newObj; }); }) .then(result => { console.timeEnd(rnd); return result; }); 

下面是console.time()输出,它稳定增加,直到达到60000 ms的queueTimeout限制。

 97.24179652744425: 12226.930ms 38.14057213652584: 14583.518ms 46.19793585774834: 16024.785ms 16.12600313565251: 17820.694ms 87.73720584788988: 20809.461ms 54.711100085462604: 22652.638ms 42.474404414891744: 24037.868ms 49.09845121453702: 26521.596ms 87.70258724764568: 29461.480ms 1.0731996619882223: 31210.875ms 90.33430329792829: 32259.944ms 37.4829457960367: 34076.824ms 9.731832830291932: 35292.281ms /home/nathanjones/Projects/test-forge/node_modules/@reactivex/rxjs/dist/cjs/util/subscribeToResult.js:41 root_1.root.setTimeout(function () { throw err; }); ^ Error: NJS-040: connection request timeout 

我试图包括大部分的相关代码,请让我知道,如果你需要更多的上下文。

编辑:

每次调用.execute()函数时,我都添加了一个console.log(pool._logStats())语句。 我已经包含上次在NJS-040错误之前打印的输出:

 Pool statistics: ...total up time (milliseconds): 62823 ...total connection requests: 1794 ...total requests enqueued: 1769 ...total requests dequeued: 0 ...total requests failed: 0 ...total request timeouts: 0 ...max queue length: 1769 ...sum of time in queue (milliseconds): 0 ...min time in queue (milliseconds): 0 ...max time in queue (milliseconds): 0 ...avg time in queue (milliseconds): 0 ...pool connections in use: 25 ...pool connections open: 25 Related pool attributes: ...queueRequests: true ...queueTimeout (milliseconds): 60000 ...poolMin: 10 ...poolMax: 25 ...poolIncrement: 1 ...poolTimeout (seconds): 60 ...stmtCacheSize: 30 Related environment variables: ...process.env.UV_THREADPOOL_SIZE: undefined undefined 

问题474中的节点-oraracledb回购正在讨论和分析这个问题 。

你需要确保你closures连接。

您可能需要增加UV_THREADPOOL_SIZE