gpt4 book ai didi

mysql - mysql使用连接池时为什么需要释放连接?

转载 作者:行者123 更新时间:2023-11-29 09:38:32 25 4
gpt4 key购买 nike

我正在尝试按照this实现nodejs mysql数据库教程。我知道

pool.query() is a shortcut for pool.getConnection() + connection.query() + connection.release().

文章中数据库配置为:

var mysql = require('mysql')
var pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'matt',
password: 'password',
database: 'my_database'
})
pool.getConnection((err, connection) => {
if (err) {
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
console.error('Database connection was closed.')
}
if (err.code === 'ER_CON_COUNT_ERROR') {
console.error('Database has too many connections.')
}
if (err.code === 'ECONNREFUSED') {
console.error('Database connection was refused.')
}
}
if (connection) connection.release()
return
})
module.exports = pool

这可以用作:

pool.query('SELECT * FROM users', function (err, result, fields) {
if (err) throw new Error(err)
// Do something with result.
})

但是我真的不明白这是什么意思

if (connection) connection.release()

如果使用池自动释放连接,为什么我们需要这个?

最佳答案

执行pool.getConnection()后,您将从池中删除一个连接,然后您可以使用该连接,并且其他人都无法从池中访问该连接。使用完毕后,将其放回池中,以便其他人可以使用它。

因此,当不使用pool.query()(如您所知,它会自动将其放回池中)时,您必须获得一个连接,用它做任何您想做的事情,然后将自己放回池中。

如果您需要做的只是单个查询,则使用pool.query()并让它自动从池中获取连接,运行查询,然后将其释放回池。但是,如果您想使用连接执行多项操作,例如多次查询或多次插入数据库,则获取连接,使用它执行多个操作,然后将其释放回池。从池中手动获取连接还允许您在该连接上建立状态并在多个操作之间共享该状态。对pool.query()的两次连续调用实际上可能使用池中的不同连接。它们甚至可能并行运行。

However, I really do not understand the point of

if (connection) connection.release()

Why do we need this if using pool releases the connection automatically?

如果您手动从池中获取连接,那么当您使用connection.release()完成连接后,您必须手动将其放回池中。否则,池中的连接很快就会清空,并且您将拥有一堆任何人都无法使用的空闲连接。

如果您使用像pool.query()这样的自动方法,那么它将在单个查询操作后将其放回池中。

将其视为自动模式与手动模式。手动模式可以让您更好地控制自己的工作方式,但当自动模式符合您的需求时,它会更容易使用。当自动模式 (pool.query()) 不能完全满足您的要求时,请手动从池中获取连接,使用它并将其放回。

关于mysql - mysql使用连接池时为什么需要释放连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57121227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com