未使用await返回引发QueryRunner未释放、连接池报错等问题求助
Async函数未使用return await导致的数据库连接池问题分析
原始代码
async noAwaitFunction(){ const queryRunner = this.datatSource.createQueryRunner("master"); try{ return this.repo.createQueryBuilder(SomeEntity,queryRunner).find(); }catch(err){ // 注:原代码拼写错误为cath throw err; }finally{ await queryRunner.release(); } }
问题现象
多次调用noAwaitFunction()后,出现错误追踪失效,后续触发pool does not exist错误。
原因解析
1. 直接返回Promise打乱finally执行时机
当直接return this.repo.createQueryBuilder(...).find()时,查询的Promise会立即作为函数返回值抛出,函数执行流程直接跳转到finally块执行await queryRunner.release()。此时数据库查询可能还在执行中,但对应的queryRunner已被提前释放——绑定的数据库连接被强制回收,正在进行的查询失去合法上下文。
2. 连接池混乱与错误追踪失效
- 数据库连接池的连接被错误标记为可用,但实际还有未完成的查询操作,多次调用后会耗尽连接池资源,最终触发
pool does not exist错误。 - 同时,查询Promise脱离了函数的
try/catch范围,查询过程中抛出的错误无法被当前函数的错误处理逻辑捕获,导致错误追踪上下文丢失,出现追踪失效的情况。
3. return await的修复逻辑
使用return await时,函数会等待查询Promise完全执行完成(成功或失败)后,才进入finally块释放queryRunner:
- 保证查询操作彻底结束后才回收数据库连接,连接池状态维持正常。
- 查询过程中抛出的错误会被
try/catch捕获(即使只是重新抛出),错误追踪的上下文得以保留,不会出现追踪失效问题。
额外提示
原代码存在拼写错误:cath应为catch,datatSource应为dataSource,这类小错误也可能影响代码正常执行逻辑,建议修正。
内容的提问来源于stack exchange,提问作者hi iam shy
相关产品推荐
相关产品推荐

