繁体   English   中英

尝试运行种子时出错:Knex:获取连接超时。 游泳池可能已满

[英]Error trying to run seeds: Knex: Timeout acquiring a connection. The pool is probably full

每次运行yarn knex seed:run出现此错误:

执行“/home/user/path-to-the-file/my-seed.js”种子时出错:Knex:获取连接超时。 游泳池可能已经满了。 你错过了一个 .transacting(trx) 电话吗?

问题是我将项目发送给其他人并且他们可以正常运行它,我已经尝试了互联网上所有关于它的答案,我不知道该怎么办了。

我的数据库配置:

const config = Object.freeze({
  client: 'pg',
  pool: {
    min: 0,
    max: 5,
    idleTimeoutMillis: 30000,
    createTimeoutMillis: 3000,
    acquireTimeoutMillis: 30000,
    reapIntervalMillis: 1000,
    createRetryIntervalMillis: 100,
    propagateCreateError: false
  },
  connection: Object.freeze({
    ...database
  })
})
  • Knex 版本:“^0.95.8”
  • pg 版本:“^8.7.1”
  • 纱线版本:1.22.11
  • 节点版本:14.17.4

我已经尝试降级 pg 和 node,它没有工作,没有任何工作。

Knex存储库上有一个问题说升级到最新的pg解决了它,但它也没有工作: https : //github.com/knex/knex/issues/2820

有人能帮我吗?

创建此错误的一种简单方法是执行以下操作:

const rows = [];
for (let i =  0; i < 10000; i++) {
  rows.push({ name : `foo  ${i}` });
}
await Promise.all(rows.map(data => knex('user').insert(data)));

有无数种方法可以耗尽连接,但最常见的情况是打开太多并发事务或运行大量并行查询。

找出它发生原因的最佳方法是删除部分有问题的代码,直到错误不再发生,然后调查为什么减少的测试用例会失败。

查看 knex 在内部做什么的一种好方法是在运行代码之前设置DEBUG=knex:*环境变量,以便 knex 在代码执行时输出有关查询、事务和池连接的信息。

面临类似的问题,将 pg 提高到 8.7.1 并且有效

也节点到 16.3.1 和 knex 到 0.95.11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM