NodeJS Mysql pool.query() 没有释放连接?
NodeJS Mysql pool.query() not releasing connections?
我在使用 nodeJS 合并 mysql 连接时遇到问题。据我了解,在创建池时,我应该能够使用 pool.query() 来:
- 获取连接
- 运行 我的查询
- 释放连接
但是,我 运行 遇到的问题是连接保持打开状态并“休眠”,直到服务器自行关闭连接(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"])
}
}
})
}
})
但是,连接仍然存在,直到服务器将它们踢掉。非常感谢任何帮助。
池不会关闭连接。它将 释放 连接,这意味着它可以被另一个查询重用。池这样做是为了优化性能,因为打开新连接需要时间。
如果您想在使用后关闭连接,您可以显式销毁它 (connection.destroy()
),池将在您下次发出查询时创建一个新连接。您可以在 pooling connections.
下的文档中找到更多相关信息
我在使用 nodeJS 合并 mysql 连接时遇到问题。据我了解,在创建池时,我应该能够使用 pool.query() 来:
- 获取连接
- 运行 我的查询
- 释放连接
但是,我 运行 遇到的问题是连接保持打开状态并“休眠”,直到服务器自行关闭连接(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"])
}
}
})
}
})
但是,连接仍然存在,直到服务器将它们踢掉。非常感谢任何帮助。
池不会关闭连接。它将 释放 连接,这意味着它可以被另一个查询重用。池这样做是为了优化性能,因为打开新连接需要时间。
如果您想在使用后关闭连接,您可以显式销毁它 (connection.destroy()
),池将在您下次发出查询时创建一个新连接。您可以在 pooling connections.