Knex:超时获取连接。游泳池可能已满。您是否缺少.transacting(trx)通话?

Sha*_*raj 9 node.js knex.js

我正在使用以下代码进行knex连接,但经常发生错误

Knex:超时获取连接。游泳池可能已满。您是否缺少.transacting(trx)通话?

谁能为这个问题提出解决方案?

var knexConn = reqKnex({
        client: pClient,
        native: false,
        connection: pConn,
        searchPath: pSearchPath,
        pool: {
            max: 7,
            min: 3,
            acquireTimeout: 60 * 1000
        }
    });


function getTransactionScope(pKnex, callback) {
    try {
        pKnex.transaction(function(trx) {
            return callback(trx);
        });
    } catch (error) {
        console.log(error);
    }
}

function ExecuteSQLQuery(pTranDB, pTrx, pQuery, pCallback) {
    try {
        var query = pTranDB.raw(pQuery);

        if (pTrx) {
            query = query.transacting(pTrx);
        }
        query.then(function(res, error) {
            try {
                if (error) {
                    console.log(error);
                } else {
                    return pCallback(res, error);
                }
            } catch (error) {
                console.log(error);
            }
        }).catch(function(error) {
            return pCallback(null, error);
        });
    } catch (error) {
        console.log(error);
    }
}

function Commit(pTrx, pIsCommit) {
    try {
        if (pIsCommit) {
            pTrx.commit();
        } else {
            pTrx.rollback();
        }
    } catch (error) {
        console.log(error);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*vic 31

我用这些版本解决了这个问题:

"knex": "^0.21.1",
"objection": "^2.1.3",
"pg": "^8.0.3"
Run Code Online (Sandbox Code Playgroud)

  • 在节点 14 + pg 8.0.2 中遇到此问题。将 pg 更新到 8.0.3 解决了我的问题! (3认同)
  • 不过,这是一个有用的版本:更新到这些版本解决了我的问题。显然,节点 14 刚刚出现并破坏了 knex 或 pg 驱动程序或其他地方的某些内容...连接失败,您得到的只是“Knex:获取连接超时”。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?`。 (2认同)
  • “反对”库有什么用?我不认为它是我的代码中的依赖项? (2认同)

小智 14

我最近有这个问题,我刚刚更新到 Node v14.2.0

在此处输入图片说明

此版本似乎对 knex 进行了重大更改。幸运的是我有 NVM,所以我切换到另一个版本(v12.16.3),这解决了这个问题。

在此处输入图片说明

祝你好运!

  • 确认了这一点。我当时在节点 14.4.0 上,然后使用 nvm 移回到 12.14.1(选择了队友正在使用的版本),一切都很好。 (3认同)

fox*_*bit 9

我做了一些测试。这是结果。

"knex": "^0.20.8",
"objection": "^2.1.2",
"pg": "^7.14.0"
Run Code Online (Sandbox Code Playgroud)

使用这些版本,我的应用程序在节点上运行良好12.22.7,但我在14.18.1.

更新pg到版本8.0.2

  • 12.22.7-> 它工作正常
  • 14.18.1-> knex 超时错误

更新pg到版本8.0.3

  • 12.22.7-> 它工作正常
  • 14.18.1-> 它工作正常

14pg版本为 时,该问题在节点上消失8.0.3

  • 这应该被接受的答案。它也适用于节点 v16.13.1。 (2认同)

Ant*_*ito 7

我升级到 node 时也遇到了这个问题14.0.0。我恢复了我的节点版本,这个问题就消失了。


Ali*_*aza 7

属性propagateCreateError应该设置为false以防止超时获取连接。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?错误。

池配置示例:

"pool": {
  "min": 2,
  "max": 6,
  "createTimeoutMillis": 3000,
  "acquireTimeoutMillis": 30000,
  "idleTimeoutMillis": 30000,
  "reapIntervalMillis": 1000,
  "createRetryIntervalMillis": 100,
  "propagateCreateError": false // <- default is true, set to false
},
Run Code Online (Sandbox Code Playgroud)

说明:在 Knex 中, propagateCreateError默认设置为 true,如果第一次创建数据库连接失败,则会抛出TimeoutError,从而阻止 tarn(连接池管理器)自动重新连接。

解决方案是将propagateCreateError设置为 false,从而使knex在创建连接失败时自动重新连接,而不是抛出错误。

AuroraDB:如果您连接到 AuroraDB 实例,目前它的启动时间很长,导致每次新的冷启动时出现 TimeoutError,要解决此问题,请设置 AWS Console -> RDS -> AuroraDB Instance -> Pausecomputecapacity连续几分钟不活动后:1440 小时,以防止数据库完全进入睡眠状态。

详细说明请参见 https://github.com/knex/knex/issues/2820

  • 警告 - Knex 团队不支持此选项,knex 需要此选项为“true” https://github.com/knex/knex/issues/3455 (2认同)
  • knex 核心贡献者“elhigu”不推荐 **propagateCreateError = false** 解决方案,请始终考虑这些人所说的内容。他说,我引用,“决不应该将 knex 设置为 false”。有关更多信息,请阅读 [https://github.com/mikro-orm/mikro-orm/issues/2108] (2认同)

Joe*_*l H 6

对于遇到此问题的其他人来说,这也可能是由于数据库主机名中的拼写错误造成的(就像我的情况一样)。


ale*_*lli 5

将 Strapi 应用程序部署到 heroku 时,我遇到了同样的问题。在我的 package.json 中,我有以下版本:

  • "knex": "<0.20.0"
  • "pg": "^7.18.2"

我还有以下节点引擎配置:

"engines": {
  "node": ">=10.0.0",
  "npm": ">=6.0.0"
},
Run Code Online (Sandbox Code Playgroud)

将版本更改为<0.21.1^8.0.3(如此处建议:https : //stackoverflow.com/a/61482183/4696783)并将节点引擎更改为12.16.x(如此处建议:https : //stackoverflow.com/a/61942001/4696783)解决了问题。


Tod*_*ski -3

我有同样的问题,考虑到: 这篇文章

属性propagateCreateError应该设置为false以防止超时获取连接。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?错误。

池配置示例:

“池”:{“分钟”:2,“最大”:6,“createTimeoutMillis”:3000,“acquireTimeoutMillis”:30000,“idleTimeoutMillis”:30000,“reapIntervalMillis”:1000,“createRetryIntervalMillis”:100,“propagateCreateError” : false // <- 默认为 true,设置为 false },说明:

在 Knex 中,propagateCreateError 默认设置为 true,如果第一次创建数据库连接失败,则会抛出 TimeoutError,从而阻止 tarn(连接池管理器)自动重新连接。

解决方案是将propagateCreateError 设置为 false,从而使 knex 在创建连接失败时自动重新连接,而不是抛出错误。

这篇文章

我做了以下配置

module.exports = {
    client: 'pg',
    connection: {
        host: config.testDB.host,
        user: config.testDB.userName,
        port: config.testDB.port,
        password: config.testDB.password,
        database: 'testdb',
        charset: 'utf8'
    },
    pool: {
        max: 50,
        min: 2,
        // acquireTimeout: 60 * 1000,
        // createTimeoutMillis: 30000,
        // acquireTimeoutMillis: 30000,
        // idleTimeoutMillis: 30000,
        // reapIntervalMillis: 1000,
        // createRetryIntervalMillis: 100,
        propagateCreateError: false // <- default is true, set to false
    },
    migrations: {
        tableName: 'knex_migrations'
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它不适合您,请尝试将propagateError设置为true并取消注释

 "idleTimeoutMillis": 30000,
 "createTimeoutMillis": 30000,
 "acquireTimeoutMillis": 30000
Run Code Online (Sandbox Code Playgroud)