Node.js调用Oracle存储过程时进程冻结问题排查求助
Node.js调用Oracle存储过程时进程冻结问题
场景与代码示例
Oracle存储过程(简化版)
存储过程通过动态SQL组装查询,将结果通过REF_CURSOR返回:
PROCEDURE selectSomeDate(res out sys_refcursor) IS BEGIN open res for 'select x from dual'; -- 实际执行耗时1秒至数分钟 END;
Node.js核心交互代码(使用oracledb库)
获取连接与执行存储过程的函数
async function getConnect() { conn = await oradb.getConnection(); // 获取数据库连接 opts.outFormat = oradb.OUT_FORMAT_OBJECT; opts.prefetchRows = 100; // 尝试过设为0或删除此配置 opts.resultSet = true; // 尝试过设为false或删除此配置 const result = await conn.execute(sqltext, binds, opts); // 执行存储过程 return result; }
从游标提取数据的函数
async function getData(sqlStatement) { const connect = sqlStatement.conn; const cursor = await sqlStatement.result.outBinds.result; // 读取数据时进程冻结 const res = await cursor.getRows(); await cursor.close().catch(e => { logger.error(msg(`Ошибка закрытия курсора ${e}`, printStackTrace(e))); }); await connect.close().catch(e => { logger.error(msg(`Ошибка закрытия соединения ${e}`, printStackTrace(e))); }); return res; }
OUT绑定变量声明
result: { type: oradb.CURSOR, dir: oradb.BIND_OUT },
已设置环境变量 UV_THREADPOOL_SIZE=100。
问题现象
- 单请求场景:等待数据库返回数据期间,Node.js进程冻结N秒(等于SQL查询耗时),冻结期间无法响应任何网络请求、控制台输出停止,收到响应后恢复正常。
- 批量请求场景:进程直接停止,无任何响应。
环境信息:Node.js 14.17、Oracle数据库19c、Oracle客户端12.2
更新信息
冻结发生在Node.js收到游标但SQL查询仍在执行的阶段,SQL执行完成数据到达后进程恢复。疑似等待期间Node.js持续轮询数据库,导致数据库CPU负载升高,但直接在数据库中执行该存储过程无此异常负载。
排查方向与解决思路
- 调整
resultSet参数:当resultSet=true时,驱动会在服务器端维护结果集,客户端通过游标逐步拉取数据。尝试强制设置resultSet=false,让驱动一次性获取所有结果,观察是否还会阻塞事件循环。 - 优化
prefetchRows配置:当前设置为100,尝试调大该值(如1000、5000)以减少客户端与数据库的交互次数;或设为0让驱动自动适配,看是否能缓解轮询导致的CPU负载问题。 - 验证Oracle客户端兼容性:Node.js 14搭配Oracle客户端12.2可能存在兼容性问题,尝试升级客户端至19c(与数据库版本一致),排查是否因版本不匹配导致阻塞。
- 监控事件循环状态:在冻结期间通过
process._getActiveHandles()和process._getActiveRequests()检查事件循环是否被阻塞,确认阻塞是否由oracledb的底层操作导致。 - 排查存储过程执行逻辑:对比直接在数据库执行存储过程与Node.js调用时的执行计划,检查动态SQL是否因绑定方式差异触发异常执行计划,导致客户端出现异常等待行为。
- 隔离数据库操作至Worker线程:将耗时的数据库查询操作放到Node.js Worker线程中执行,避免阻塞主线程的事件循环,确保进程能正常响应其他请求。
- 检查线程池使用情况:虽然设置了
UV_THREADPOOL_SIZE=100,但oracledb的某些同步底层操作可能占满线程池,导致事件循环无法处理其他任务。可通过监控线程池状态,确认是否存在线程耗尽的情况。
内容的提问来源于stack exchange,提问作者SwaD
相关产品推荐
相关产品推荐

