You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:40:31