【问题标题】:Connection sits idle forever on PostgreSQL with Node.js and pg使用 Node.js 和 pg 在 PostgreSQL 上连接永远处于空闲状态
【发布时间】:2022-10-01 09:07:46
【问题描述】:

我们在node-postgres 文档中有以下内容:

// number of milliseconds to wait before timing out when connecting a new client
// by default this is 0 which means no timeout
connectionTimeoutMillis?: int,

然后,稍后在同一个文档中:

完成客户端后,您必须调用 releaseCallback 或 client.release(指向 releaseCallback)。如果您忘记释放客户端,那么您的应用程序将很快耗尽可用的客户端,池中的空闲客户端以及对 pool.connect 的所有进一步调用将超时并出现错误或如果您将 connectionTimeoutMillis 配置为 0,则无限期挂起.

所以,我期待如果我将connectionTimeoutMillis设置为1000,那么在空闲1s后,它应该会自动释放连接,即使我不调用client.release()

但是运行下面的代码在 PostgreSQL 上永远处于空闲状态:

// test.js
// PostgreSQL v14.2
// Node.js v16.15.1
// node-postgres (pg) v8.7.3

const { Pool } = require(\'pg\')

const pool = new Pool({
    user: \'postgres\',
    password: \'postgres\',
    host: `localhost`,
    port: 5432,
    database: \'app_dev\',
    max: 10,
    connectionTimeoutMillis: 1000,
    idleTimeoutMillis: 1000
})

;(async function() {
    const client = await pool.connect()
    const {rows} = await client.query(\'SELECT NOW()\')
    console.log(rows[0])
})()

我错过了什么吗?

    标签: node.js postgresql node-postgres


    【解决方案1】:

    我想这就是你所缺少的

    当您的应用程序调用时

    const client = await pool.connect()
    

    这是connectionTimeoutMillis 有效的地方。即,它是尝试让客户端(连接)到您的 PostgresDB 时等待的时间量(以毫秒为单位)。如果将其设置为 1000 毫秒,则意味着,如果我没有在 1000 毫秒内创建新客户端或从池中返回现有客户端 - 抛出错误.因此,由于您是在获得客户端之后-不会释放它或在您拥有客户端时将您的客户端隐式返回到池中-因此无需等待建立连接。

    idleTimeoutMillis 时间是指客户端(连接)在被销毁之前可以位于池中而不会被您的应用程序代码调用的时间量。 例如,假设您的池的大小为 1 个客户端。您的应用程序使用客户端,然后将其释放回池。如果您的应用程序在超过 1000 毫秒内没有请求另一个客户端,即客户端在池中空闲的时间等于或大于 idleTimeoutMillis - 它将被销毁。

    【讨论】:

    • 这完全有道理,谢谢你的回答,现在更清楚了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多