MySQL 调用 connection.end() => 后无法打开连接 => 错误:池已关闭

Posted

技术标签:

【中文标题】MySQL 调用 connection.end() => 后无法打开连接 => 错误:池已关闭【英文标题】:MySQL Can not open connection after call connection.end() => Error: Pool is closed 【发布时间】:2022-01-10 21:49:57 【问题描述】:

config.js

const mysql = require('mysql2');

const config = 
    host: 'localhost',
    port: '3306',
    user: 'root',
    password: 'root',
    database: 'krometal',
    charset: "utf8mb4_bin",
    multipleStatements: true
;
const connection = mysql.createPool(config);

connection.getConnection(function (err, connection) 
    //connecting to database
    if (err) 
        logger.log('error', err);
        console.log("MYSQL CONNECT ERROR: " + err);
     else 
        logger.log('info', "MYSQL CONNECTED SUCCESSFULLY.");
        console.log("MYSQL CONNECTED SUCCESSFULLY.");
    
);

module.exports = 
    connection

login.js

const loginUser = async (req, callback) => 
  connection.query(sql, async function (err, rows) => 
      // logic
      callback(result, 401, connection);
  )

route.js

users.post('/users/login', async (req, res) => 
    await loginUser(req, async (response, code, connection) => 
        await connection.end();
        res.status(code).send(response);
    );
);

问题是我第一次尝试登录时工作正常,但如果我再次尝试相同的登录 API,则会抛出错误 Error: Pool is closed.

我应该使用

connection.end()

方法是每次打开连接还是mysql2自动结束连接?

【问题讨论】:

【参考方案1】:

别跑

await connection.end();

运行此功能后,您需要使用创建新连接

connection.getConnection();

【讨论】:

我删除了await connection.end();,一切正常,但在大范围内,连接将达到极限。 我应该把connection.getConnection();放在哪里,为什么?我认为一旦我点击任何 api 就应该打开连接 @HusseinMohamed 我认为每次收到请求时打开新连接并不是一个好主意。性能将是一个大问题。 @HusseinMohamed 文档说,您可以在不使用 pool.getConnection() 的情况下使用 pool.query。 https://github.com/mysqljs/mysql#pooling-connections 我使用的是github.com/sidorares/node-mysql2而不是github.com/mysqljs/mysql

以上是关于MySQL 调用 connection.end() => 后无法打开连接 => 错误:池已关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何结束 mysql 连接而不让它挂在 NodeJS 中?

PHP 中的 Azure 通知给单个用户

自动调用mysql存储过程

急求php文件的内容调用和mysql内容调用方法

mysql里边,存储过程之间相互调用

PHP为啥不能调用MySQL