当前位置: 首页 > 知识库问答 >
问题:

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

哈朗
2023-03-14

我正在尝试按照本教程实现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个答案

爱海
2023-03-14

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

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

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

但是,我真的不明白

如果(connection)connection.release()

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

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

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

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

 类似资料:
  • 问题内容: 使用JDBC连接池工具(如DBCP或c3p0)有什么好处? 如果只有 一个* 用户的 小型CRUD 应用程序,我们是否可以将 一个 连接会话创建为一个 单例 ? * PS :我正在构建一个带有小型数据库(5个表)的小型后端应用程序。 问题答案: 从Jon Skeet的答案到连接和语句池的好处是什么?: 创建到数据库服务器的网络连接是(相对)昂贵的。同样,要求服务器准备SQL语句(相对)

  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置

  • 这是我对Rest模板的配置,

  • 当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。 他们使连接超过maxConnection变量。 这是我写的。 即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,10)”,有22个空闲连接。天啊 //NettyClient.java //NettyClientTest。Java语言 14:55:27.397[reactor-tcp

  • 本文向大家介绍解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?相关面试题,主要包含被问及解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?时的应答技巧和注意事项,需要的朋友参考一下 池话设计应该不是一个新名词。我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观