Node.js连接Azure托管MariaDB时出现连接池超时错误排查
问题描述
我尝试使用Node.js连接Azure上托管的MariaDB数据库,但无法确定以下错误信息的根本原因:
% node dbTest.js Total connections: 0 Active connections: 0 Idle connections: 0 SqlError: (conn=-1, no: 45028, SQLState: HY000) retrieve connection from pool timeout after 10003ms (pool connections: active=0 idle=0 limit=5) at module.exports.createError (/Users/myuser/nextjs-test/node_modules/mariadb/lib/misc/errors.js:64:10) at Pool._requestTimeoutHandler (/Users/myuser/nextjs-test/node_modules/mariadb/lib/pool.js:349:26) at listOnTimeout (node:internal/timers:573:17) at process.processTimers (node:internal/timers:514:7) { sqlMessage: 'retrieve connection from pool timeout after 10003ms\n' + ' (pool connections: active=0 idle=0 limit=5)', sql: null, fatal: false, errno: 45028, sqlState: 'HY000', code: 'ER_GET_CONNECTION_TIMEOUT' }
最小可复现示例
该示例取自MariaDB官方文档,仅修改了连接池初始化中的凭据,并将SQL查询改为多数数据库架构中有效的语句:
// Required Modules const mariadb = require("mariadb"); //Initialize Pool const pool = mariadb.createPool({ host: "<host name or IPv4 address>", user: "<user name>", password: "<password>", database: "<database name>", connectionLimit: 100, }); console.log("Total connections: ", pool.totalConnections()); console.log("Active connections: ", pool.activeConnections()); console.log("Idle connections: ", pool.idleConnections()); async function main() { let conn; try { conn = await fetchConn(); // Use Connection var rows = await get_select(conn); for (i = 0, len = rows.length; i < len; i++) { console.log("Total connections: ", pool.totalConnections()); console.log("Active connections: ", pool.activeConnections()); console.log("Idle connections: ", pool.idleConnections()); console.log(rows); } } catch (err) { // Manage Errors console.log(err); } finally { // Close Connection if (conn) conn.end(); } } // Fetch Connection async function fetchConn() { let conn = await pool.getConnection(); console.log("Total connections: ", pool.totalConnections()); console.log("Active connections: ", pool.activeConnections()); console.log("Idle connections: ", pool.idleConnections()); return conn; } //Get select query async function get_select(conn) { return await conn.query("SELECT 1 AS val"); } main();
已排除的可能原因
- 网络或防火墙问题:已将本机IP加入白名单,且能通过Python的
mysql.connector以及SQL Developer、MySQL Workbench等IDE成功连接目标数据库。 - 数据库配置问题:已检查数据库超时设置,若存在超时问题,大概率源自本地机器而非数据库。
- IPv4与IPv6问题:已尝试将主机名替换为IPv4地址,且相关解决方案多针对
localhost场景,与当前情况不符。 - 凭据或环境变量问题:已确认数据库凭据无拼写错误,且在代码中显式写入凭据,排除环境变量读取问题。
- 端口问题:已确认数据库使用默认端口3306。
补充信息
StackOverflow上其他用户也遇到过相同错误,但他们帖子中的解决方案无法解决我的问题。我已复现多数相关示例,即使应用已采纳答案,多数情况下仍会出现相同错误。
系统及包版本信息
- macOS Sonoma 14.1
- node v20.10.0
- mariadb@3.2.2
内容的提问来源于stack exchange,提问作者Bryton Beesley
相关产品推荐
相关产品推荐

