node-oracledb连接池未释放空闲连接至poolMin的问题排查
低流量时node-oracledb连接池无法回落至poolMin的可能原因
结合你的配置、现象及node-oracledb的机制,以下是几种常见的原因:
1. Oracle Client版本低于21且低流量时无池访问
node-oracledb的连接池收缩逻辑在Oracle Client 21之前有个限制:只有当连接池被主动访问(比如调用getConnection())时,才会触发对空闲超时连接的清理。如果低流量期间完全没有请求访问连接池,那些超过poolTimeout的空闲连接不会被自动关闭,也就无法回落至poolMin。
2. 连接未正确归还到池
如果应用代码中存在未调用connection.close()(或异步场景下未正确await该方法)的情况,这些连接会被标记为"正在使用"状态,即使实际没有业务操作,连接池也不会将其判定为空闲连接进行回收。你可以通过pool.getStatistics()的inUse指标确认是否存在这类未归还的连接。
3. 空闲连接被零星请求复用,重置超时计时器
低流量期间如果有零星的请求持续复用空闲连接,会重置该连接的超时计时器,导致连接始终达不到poolTimeout的阈值,无法被连接池关闭。这种情况下,连接数会维持在高于poolMin的水平,只有当所有超额连接都连续空闲满10秒时才会回落。
4. 数据库会话存在未释放的资源
即使连接已归还到池,Oracle数据库侧如果存在未完成的事务、未关闭的游标或其他会话级资源,会导致数据库会话无法被正常终止,连接池也就无法关闭该连接。你可以通过数据库查询(比如SELECT sid, serial#, status, username, program FROM v$session)检查会话状态,确认是否存在挂起的事务或资源。
内容的提问来源于stack exchange,提问作者Srikanth Vudharapu
相关产品推荐
相关产品推荐

