Nodejs + Knex + Postgres:未处理的拒绝错误:池被破坏

我和我的团队使用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但没有帮助。 至less在本地。

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

问题2 :由于我们无法build立与数据库的连接, Pool is destroyed发生错误,因此Knex假定池不存在?

问题3 :我们可以以什么方式设置API进入“待机模式”,当它不能build立连接,并等待一个开放的发生?

问题4 :对于任何生产应用,最大设置是否太低? 我们仍然处于testing阶段,但是我们很快就会大幅增加stream量。

更新:

我们甚至把我们的pool.max增加到15,我们仍然有这个问题。