如何在Node.js的TypeORM中为MariaDB连接设置socketTimeout
TypeORM + MariaDB 查询超时设置不生效的解决方法
一、修正连接配置
之前的配置里,超时参数的位置和优先级不对,mariadb驱动只认extra对象里的配置项,调整后的正确配置如下:
const { createConnection } = require("typeorm"); const mariadb = require("mariadb"); async function main() { const connection = await createConnection({ type: 'mariadb', host: 'hostname', port: 3306, username: 'db username', password: 'db password', database: 'db name', connectTimeout: 5000, // 连接超时,这个配置没问题 extra: { queryTimeout: 10, // 核心!控制查询执行的超时时间,单位毫秒 socketTimeout: 10 // 套接字空闲超时,和查询执行超时不是一回事 } }); const results = await connection.query('query string'); console.log(results); } main().catch((error) => { console.error(error); });
二、为什么之前的配置没效果
- 直接写在connection根节点的
socketTimeout会被TypeORM过滤掉,不会传递给mariadb驱动,必须放在extra里驱动才能读取到。 socketTimeout是控制套接字空闲状态的超时,不是查询执行的超时时间,要限制查询运行时长,得靠queryTimeout。
三、备选方案:单个查询单独设置超时
如果全局配置还是不生效,可以给单个查询单独指定超时:
用QueryRunner手动控制
async function main() { const connection = await createConnection(/* 你的连接配置 */); const queryRunner = connection.createQueryRunner(); try { await queryRunner.connect(); // 第三个参数传入timeout配置 const results = await queryRunner.query('query string', [], { timeout: 10 }); console.log(results); } finally { // 记得释放QueryRunner await queryRunner.release(); } }
数据库层面强制超时
直接在SQL语句里添加超时限制,绕过驱动配置的问题:
SET STATEMENT = '你的查询语句' FOR MAX_EXECUTION_TIME=10;
这条SQL会让数据库自动终止运行超过10毫秒的查询。
内容的提问来源于stack exchange,提问作者Abhishek Jain
相关产品推荐
相关产品推荐

