提问者:小点点

为什么我们在MySQL中使用连接池时需要释放连接?


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

查询()是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会自动释放连接,为什么我们需要这样做呢?


共1个答案

匿名用户

执行pool.getConnection()之后,您将从池中删除一个连接,然后您可以使用该连接,并且其他人无法从池中访问该连接。当你用完它,你把它放回池里,这样其他人就可以使用它了。

因此,当不使用pool.query()(您知道它会自动将其放回池中)时,您必须获得一个连接,对其执行任何您想要的操作,然后自己将其放回池中。

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

但是,我真的不明白

如果(connection)connection.release()

如果使用pool会自动释放连接,为什么我们需要这样做呢?

如果您手动从池中获取连接,那么在使用connection.release()完成连接后,您必须手动将其放回池中。否则,池很快就会没有连接,您就会有一堆闲置的连接,任何人都不能使用这些连接。

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

把它想象成自动模式和手动模式。手动模式可以让你更好地控制你如何做事情,但当自动模式符合你的需要时,它更容易使用。当自动模式(pool.query())不能完全执行您想要的操作时,请手动从池中获取连接,使用它并将其放回。