【问题标题】:Nodejs + Knex + Postgres: Unhandled rejection Error: Pool is destroyedNodejs + Knex + Postgres:未处理的拒绝错误:池被破坏
【发布时间】:2016-01-15 06:48:42
【问题描述】:

我和我的团队使用 knex 和 postgres 来处理我们所有的数据库工作。有时,我们会收到以下错误:

Knex:Error Pool2 - error: too many connections for role "<rolename>"

每个请求都会出现此错误:

 app[web.2]: Unhandled rejection Error: Pool is destroyed
 app[web.2]:     at Pool.acquire (/app/node_modules/knex/node_modules/pool2/lib/pool.js:163:12)
 app[web.2]:     at /app/node_modules/knex/lib/client.js:204:19
 app[web.2]:     at tryCatcher (/app/node_modules/knex/node_modules/bluebird/js/main/util.js:26:23)
 app[web.2]:     at Promise._resolveFromResolver (/app/node_modules/knex/node_modules/bluebird/js/main/promise.js:480:31)
 app[web.2]:     at new Promise (/app/node_modules/knex/node_modules/bluebird/js/main/promise.js:70:37)
 app[web.2]:     at Client.acquireConnection (/app/node_modules/knex/lib/client.js:200:12)
 app[web.2]:     at /app/node_modules/knex/lib/runner.js:138:49
 app[web.2]:     at tryCatcher (/app/node_modules/knex/node_modules/bluebird/js/main/util.js:26:23)
 app[web.2]:     at Function.Promise.attempt.Promise.try (/app/node_modules/knex/node_modules/bluebird/js/main/method.js:31:24)
 app[web.2]:     at Runner.ensureConnection (/app/node_modules/knex/lib/runner.js:137:26)
 app[web.2]:     at Runner.run (/app/node_modules/knex/lib/runner.js:30:31)
 app[web.2]:     at QueryBuilder.Target.then (/app/node_modules/knex/lib/interface.js:27:43)
 app[web.2]:     at QueryBuilder.tryCatcher (/app/node_modules/bookshelf/node_modules/bluebird/js/main/util.js:26:23)
 app[web.2]:     at doThenable (/app/node_modules/bookshelf/node_modules/bluebird/js/main/thenables.js:52:38)
 app[web.2]:     at tryConvertToPromise (/app/node_modules/bookshelf/node_modules/bluebird/js/main/thenables.js:30:20)
 app[web.2]:     at Promise._resolveCallback (/app/node_modules/bookshelf/node_modules/bluebird/js/main/promise.js:442:24)
 app[web.2]:     at Promise._settlePromiseFromHandler (/app/node_modules/bookshelf/node_modules/bluebird/js/main/promise.js:515:17)
 app[web.2]:     at Promise._settlePromiseAt (/app/node_modules/bookshelf/node_modules/bluebird/js/main/promise.js:581:18)
 app[web.2]:     at Promise._settlePromises (/app/node_modules/bookshelf/node_modules/bluebird/js/main/promise.js:697:14)
 app[web.2]:     at Async._drainQueue (/app/node_modules/bookshelf/node_modules/bluebird/js/main/async.js:123:16)
 app[web.2]:     at Async._drainQueues (/app/node_modules/bookshelf/node_modules/bluebird/js/main/async.js:133:10)
 app[web.2]:     at Immediate.Async.drainQueues [as _onImmediate] (/app/node_modules/bookshelf/node_modules/bluebird/js/main/async.js:15:14)
 app[web.2]:     at processImmediate [as _immediateCallback] (timers.js:368:17)

我们的池设置是:

pool: {
  min: 2,
  max: 10
}

我们已尝试将其设置为 min:0,但这并没有帮助。至少在本地。

问题 1:我们能否跟踪活动连接的数量并确保没有任何“孤立”连接?如果有,怎么做?

问题 2:出现Pool is destroyed 错误是因为我们无法与数据库建立连接,因此 Knex 假定池没有退出?

问题 3:我们能否以某种方式将 API 设置为在无法建立连接并等待打开连接发生时进入“待机模式”?

问题 4:对于任何类型的生产应用程序来说,最大值设置为 10 是否太低了?我们仍处于测试阶段,但我们很快就会有大量的流量增长。

更新:

我们甚至将pool.max 增加到 15,但我们仍然遇到这个问题。

【问题讨论】:

  • 错误信息来自 postgresql 服务器,请检查其配置。但是,是的,您的应用程序端可能存在一些连接泄漏。
  • 您是否有幸解决了这个问题?遇到同样的错误。
  • 并非如此。它只发生在我们的 Heroku 开发帐户上,这只是一个爱好级别。它不会发生在我们的付费产品帐户上

标签: node.js postgresql bookshelf.js knex.js


【解决方案1】:

问题在于数据库连接。您可以检查您的数据库相关配置,例如用户名和密码。

【讨论】:

  • 您可以将此答案作为评论发送。
猜你喜欢
  • 2017-11-28
  • 2018-11-11
  • 2017-09-20
  • 2017-06-08
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多