Deno使用denodb连接MySQL关闭后CLI进程挂起无法退出问题
问题根因
- denodb@v1.0.39版本的
MySQLConnector在实例化阶段就会初始化底层MySQL连接池,连接池自带的存活心跳逻辑会持有Deno事件循环的活跃引用,哪怕没有实际发起连接、没有执行任何SQL操作,也会导致进程无法自动退出。 - 该版本的资源关闭逻辑存在疏漏,调用
db.close()和connection.close()后也没有正确释放连接池持有的定时器、连接引用,因此执行完所有代码后进程仍然会挂起。
解决方案
临时方案(适配现有版本)
在脚本所有逻辑执行完毕后,主动调用Deno.exit(0)强制终止进程即可,修改后的代码如下:
import { MySQLConnector, Database } from 'https://deno.land/x/denodb@v1.0.39/mod.ts'; console.log('I LOGGED 1'); const connection = new MySQLConnector({ host: '127.0.0.1', database: 'db_name', username: 'db_user', password: 'db_pass' }); console.log('I LOGGED 2'); const db = new Database(connection); console.log('I LOGGED 3'); await db.close(); await connection.close(); console.log('I LOGGED 4'); // 新增此行强制退出进程 Deno.exit(0);
长期方案
该问题属于denodb v1.0.39的已知缺陷,更换更高版本的denodb依赖,或直接使用Deno官方维护的MySQL驱动操作数据库,即可从根源避免进程挂起的问题。
内容的提问来源于stack exchange,提问作者LoveDev
相关产品推荐
相关产品推荐

