NestJS+TypeORM 0.3.10出现Pool does Not exists错误求助
排查NestJS + TypeORM 0.3.10主从架构下连接泄漏导致
Error: Pool does Not exists问题 1. 检查非事务场景的连接释放
虽然你已处理事务场景的QueryRunner释放,但TypeORM 0.3.x在非事务查询中若手动获取连接未释放,也会造成泄漏:
- 若存在直接调用
getConnection()或dataSource.getConnection()的逻辑,必须确保调用connection.release() - 禁止在全局单例中持有连接实例,每次使用后立即释放
2. 验证主从复制的连接池配置
TypeORM 0.3.x对主从架构的连接池管理逻辑有调整,需确认配置正确性:
- 主库和从库需分别配置
poolSize,不能仅全局设置 - 避免从库
replica配置中poolSize设为0或过小,导致连接耗尽后无法创建新连接 - 参考正确配置示例:
const dataSource = new DataSource({ type: 'mysql', host: 'master-host', port: 3306, username: 'user', password: 'pass', database: 'db', poolSize: 50, // 主库连接池大小 replicas: [ { host: 'slave-host', port: 3306, username: 'user', password: 'pass', database: 'db', poolSize: 50, // 从库连接池大小 }, ], });
3. 修复QueryRunner的异常处理逻辑
事务场景中,若异常时未执行queryRunner.release()会直接导致连接泄漏:
- 必须将
queryRunner.release()放入finally块,确保无论成功/失败都释放连接 - 错误示例(存在泄漏风险):
const queryRunner = dataSource.createQueryRunner(); await queryRunner.startTransaction(); try { await queryRunner.manager.save(Entity); await queryRunner.commitTransaction(); await queryRunner.release(); } catch (e) { await queryRunner.rollbackTransaction(); }
- 正确示例:
const queryRunner = dataSource.createQueryRunner(); await queryRunner.startTransaction(); try { await queryRunner.manager.save(Entity); await queryRunner.commitTransaction(); } catch (e) { await queryRunner.rollbackTransaction(); } finally { await queryRunner.release(); // 确保最终释放 }
4. 升级TypeORM至最新稳定版
TypeORM 0.3.x部分早期版本存在连接池管理的已知Bug,建议:
- 升级至0.3.x最新稳定版(当前为0.3.17),修复已公开的连接泄漏缺陷
- 若使用
QueryBuilder.stream()方法,需手动调用stream.destroy()释放连接(部分旧版本未自动处理)
5. 添加连接池状态监控
通过监控代码实时查看连接使用情况,定位泄漏点:
// 每分钟打印一次连接池状态 setInterval(() => { const masterPool = dataSource.driver.master.connection.pool; const replicaPools = dataSource.driver.replicas.map(r => r.connection.pool); console.log(`主库连接池: ${masterPool._allConnections.length} 已使用 / ${masterPool._freeConnections.length} 空闲`); replicaPools.forEach((pool, idx) => { console.log(`从库${idx}连接池: ${pool._allConnections.length} 已使用 / ${pool._freeConnections.length} 空闲`); }); }, 60000);
6. 确认AWS RDS的连接限制
检查RDS实例的最大连接数是否满足需求:
- RDS MySQL的最大连接数由实例规格决定,若实例最大连接数小于主从池大小之和,会导致无法创建新连接
- 可通过SQL查询确认:
SHOW VARIABLES LIKE 'max_connections';,确保其大于主库poolSize + 从库poolSize
内容的提问来源于stack exchange,提问作者zulqarnain
相关产品推荐
相关产品推荐

