【MySQL】node.js 如何判断连接池是否正确连接上了?

在使用 mysql2/promisecreatePool 时,仅仅调用 createPool 是不会立即去连接数据库的。它是"懒加载"的,只有在执行第一次查询或者手动请求连接时,才会真正尝试建立连接。

要判断连接是否正确以及数据库是否存在,推荐以下两种方式:

方法一:手动获取并释放一个连接(推荐)

这是最标准的方法。通过调用 pool.getConnection(),你可以触发一次真实的连接尝试。

javascript 复制代码
import mysql from 'mysql2/promise';

async function checkConnection() {
    let pool = mysql.createPool({
        host: configData.db_host,
        user: configData.db_user,
        database: configData.db_database,
        password: configData.db_password,
        waitForConnections: true,
        connectionLimit: 10,
        queueLimit: 0
    });

    try {
        // 尝试获取一个连接
        const connection = await pool.getConnection();
        console.log('数据库连接成功!');
        
        // 释放连接回连接池
        connection.release();
        return pool;
    } catch (err) {
        // 判断错误类型
        if (err.code === 'ER_BAD_DB_ERROR') {
            console.error('错误:数据库不存在!');
        } else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
            console.error('错误:用户名或密码错误!');
        } else if (err.code === 'ECONNREFUSED') {
            console.error('错误:无法连接到数据库服务器(IP或端口错误)!');
        } else {
            console.error('连接失败,错误代码:' + err.code);
            console.error(err.message);
        }
        return null;
    }
}

const myPool = await checkConnection();

方法二:执行一个简单的测试查询

如果你不想手动获取连接,可以直接执行一个极简查询(如 SELECT 1)。

javascript 复制代码
try {
    // 这种方式也会触发一次连接请求
    await pool.query('SELECT 1');
    console.log('数据库连接验证通过');
} catch (err) {
    if (err.code === 'ER_BAD_DB_ERROR') {
        console.error('数据库不存在');
    } else {
        console.error('连接失败:', err.message);
    }
}

如何识别"数据库不存在"?

catch 块中,你可以通过检查 err.code 属性来识别具体的错误:

  • ER_BAD_DB_ERROR (错误代码: 1049) : 表示你指定的 database 在服务器上不存在。
  • ER_ACCESS_DENIED_ERROR (错误代码: 1045): 表示用户名或密码不对。
  • ENOTFOUND / EAI_AGAIN : 表示 host 地址解析失败。
  • ECONNREFUSED: 表示数据库服务没启动,或者端口号填错了。

进阶:如果数据库不存在,自动创建它

有时你希望程序启动时如果发现数据库不存在,就自动创建一个。这时候你创建 Pool 时不能指定 database,连接成功后再创建:

javascript 复制代码
// 1. 先不指定数据库连接到服务器
const poolWithoutDB = mysql.createPool({
    host: configData.db_host,
    user: configData.db_user,
    password: configData.db_password
});

// 2. 执行创建命令
await poolWithoutDB.query(`CREATE DATABASE IF NOT EXISTS \`${configData.db_database}\``);

// 3. 此时再关闭这个 pool,或者直接切换到目标数据库使用
await poolWithoutDB.end();

// 4. 然后创建正式带数据库名的 pool
const pool = mysql.createPool({ ...configData });

总结

要判断连接情况,请在初始化后立刻执行一次 await pool.getConnection(),并捕获 err.code === 'ER_BAD_DB_ERROR' 来识别数据库不存在的情况。

相关推荐
雨辰AI7 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20247 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有7 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao8 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839498 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录8 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约9 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
颂love9 小时前
MySQL的执行流程
android·数据库·mysql
海市公约9 小时前
一条SQL查询的完整旅程:MySQL执行流程深度解析
sql·mysql·数据库优化·执行计划·连接器·查询缓存·sql执行原理
程序leo源9 小时前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#