【问题标题】:Error trying to run seeds: Knex: Timeout acquiring a connection. The pool is probably full尝试运行种子时出错:Knex:获取连接超时。游泳池可能已满
【发布时间】:2021-08-10 17:02:29
【问题描述】:

我每次运行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

有人可以帮我吗?

【问题讨论】:

  • 你的种子有虫子。除非您显示破坏代码,否则没有人可以帮助您。尝试将示例代码的大小减少到实际导致失败的部分。
  • 可能是什么错误?为什么它只是不向我显示真正的错误,而是抛出这个通用错误。
  • 这是一种错误,您从 knex 请求了太多并行连接,并且没有连接给您。 Knex 也不知道你在用这些连接做什么。您可以监控 knex 正在运行的查询/事务类型,例如在运行种子之前设置 DEBUG=knex:* 环境变量。

标签: javascript node.js knex.js


【解决方案1】:

创建此错误的一种简单方法是这样做:

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 在代码执行时输出有关查询、事务和池连接的信息。

【讨论】:

  • 是的,就是这么回事,我只是减小了插入太多行的变量的值,我的种子开始正常运行,我还是不明白,是因为我的电脑性能还是代码写得不好?因为在我的同事身上,种子运行正常,但对我来说,这总是会引发错误。
  • 代码写得不好,即使PC性能不是最好的,也没有理由发生这种情况。此外,如果数据库未在本地运行,则 Internet 连接可能会使问题仅出现在您的设置中。
【解决方案2】:

面临类似的问题,将 pg 升级到 8.7.1 并且它起作用了

也节点到 16.3.1 和 knex 到 0.95.11

【讨论】:

  • 我什么都试过了,降级、升级 pg、node 等等,唯一的解决办法就是把我的电脑从 HD 升级到 SSD。这是一个代码问题,它工作的公司有这个种子,我必须运行它,但我写得不好,没有考虑性能,所以硬件可能无法处理它。
  • 你是在使用 objection 还是 typeorm 或任何其他的 orm?
  • 没有使用 ORM
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2023-03-14
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
相关资源
最近更新 更多