【问题标题】:NodeJS Mysql pool.query() not releasing connections?NodeJS Mysql pool.query() 不释放连接?
【发布时间】:2021-06-23 01:23:33
【问题描述】:

我在使用 nodeJS 汇集 mysql 连接时遇到问题。据我了解,在创建池时,我应该能够使用 pool.query() 来:

  1. 获取连接
  2. 运行我的查询
  3. 释放连接

但是,我遇到的问题是连接保持打开状态并“休眠”,直到服务器关闭连接本身(60 秒)。我在这里做错了什么吗?就上下文而言,我正在连接到 Heroku clearDB 并在其仪表板上查看连接。

示例:登录时,我进行查询以检查登录凭据以进行身份​​验证,另一个查询以获取一组数据,另一个查询以获取另一组数据。登录后,服务器在“睡眠”模式下留下 2 个连接。它们在 60 秒到期之前不会断开连接。

这是我的 db.js 文件:

const mysql = require("mysql");

const dbConfig = require("./db.config.js");

const connection = mysql.createPool({
    host: dbConfig.HOST,
    user: dbConfig.USER,
    password: dbConfig.PASSWORD,
    database: dbConfig.DB,
    port: dbConfig.PORT,
    multipleStatements: true,
    connectionLimit: 10
})

module.exports = connection;

这是我进行查询的方式:

const sql = require("./db.js"); //Our db connection
---OMITTED---
return new Promise((resolve, reject) => {
        const select_user = "SELECT user_id, first_name, last_name, username, password, is_admin, is_active FROM users WHERE username = ? LIMIT 1"
        const params = [username]
        const user_pass = password

        sql.query(select_user, params, (err, res) => {
            if (res) {
                if (res.length) {
                    const user = res[0]
                    const hash = user.password
                    const is_active = user.is_active
                    if (is_active) {
                        bcrypt.compare(user_pass, hash).then(res => {
                            if (res) {
                                resolve({ result: true, info: { fname: user.first_name, lname: user.last_name, username: user.username, is_admin: user.is_admin, user_id: user.user_id } })
                            } else {
                                reject({ result: false, msg: "wrong_creds" })
                            }
                        }).catch(err => {
                            reject({ result: false, msg: err })

                        })
                    } else {
                        reject({ result: false, msg: "inactive" })
                    }


                } else {
                    reject({ result: false, msg: "user_not_exist" })
                }

            } else {
                console.log("MYSQL QUERY, COULD NOT SELECT USER FOR AUTHENTICATION")
                reject({ result: false, msg: err })
            }
        })


})

我的印象是 pool.query() 会在每次查询后为我关闭连接。不是这样吗?查询完成后我是否遗漏了什么?

我也试过手动方式:

        const select_string = "SELECT * FROM user_backlogs WHERE movie_id = ? AND user_id = ?"
        const params = [movie_id, user_id]
        sql.getConnection((err, connection) => {
            if (err) reject(err)
            else {
                connection.query(select_string, params, (err, res) => {
                    connection.release()
                    if (err) reject(err)
                    else {
                        if (res.length) {
                            resolve([movie_id, "exists", res[0]["added_on"]])
                        } else {
                            resolve([movie_id, "not_exists"])
                        }
                    }
                })
            }
        })

但是,连接仍然保持正常,直到服务器将它们启动。非常感谢任何帮助。

【问题讨论】:

    标签: mysql node.js pool cleardb


    【解决方案1】:

    池不会关闭连接。它将释放连接,这意味着它可以被另一个查询重用。池这样做是为了优化性能,因为打开新连接需要时间。

    如果您想在使用后关闭连接,您可以显式销毁它(connection.destroy()),并且池将在您下次发出查询时创建一个新的。您可以在pooling connections 下的文档中找到更多信息。

    【讨论】:

    • 感谢您的帮助。这为我指明了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2018-03-19
    • 2018-05-08
    • 2020-02-24
    • 2014-02-07
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多