在mysql中使用连接池时,为什么需要释放连接?

时间:2019-07-20 01:55:05

标签: mysql node.js

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

  

pool.query()是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()

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  

但是,我真的不明白

     

if (connection) connection.release()

     

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

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

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

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