Knex.js默认最大池数会导致错误:ER_CON_COUNT_ERROR:连接过多



我们有30个DigitalOcean液滴,每个液滴都供Web CRM用户使用,它们与knex共享相同的MySQL数据库.js。 对于很少的额外用户,我们会收到错误:

  • "ER_CON_COUNT_ERROR:连接过多">
  • "Knex:获取连接超时。游泳池可能已满。您是否错过了 .transacting(trx( 调用?
  • "数据包乱序。得到: 1 预期: 0">

MySQL托管在具有4GbRAM的独立服务器上,并且有大量的可用RAM和CPU(超过50%(。

在我们的 nodejs 应用程序中,knex 引用为单例:

const knex = require('knex')({
client: 'mysql',
connection: {
host: mySqlHost,
user: mySqlUser,
password: mySqlPass,
database: mySqlDb
}
})
module.exports = {
knex
};

那么,为什么即使我们的 MySQL 默认最大连接数为 150 个,也可以达到连接限制(因为我们谈论的是 30 个用户,他们执行了几乎很多读取和写入,但毕竟是 30 个用户(?!

根据 http://knexjs.org/#Installation-client"MySQL 和 PG 库的连接池的默认设置为最小值:2,最大值:10"——将其增加到即 50 是否安全?!Knex 文档对他们的池概念解释得很差,相反,他们引用 https://github.com/vincit/tarn.js 以获取"更多详细信息",并且没有任何关于 MySQL 的细节。

任何帮助都非常感谢。

附言我们意识到共享数据库会导致性能问题,但我们考虑在达到数千名用户时迁移它,从常识来看,我们可以从 MySQL 中获得它。现在我们遇到了 30+ 用户的性能问题。

我们有30个DigitalOcean液滴,每个液滴都供Web CRM用户使用,它们与knex.js共享相同的MySQL数据库。对于很少的额外用户,我们会收到错误:

如果我从这里正确理解 https://www.digitalocean.com/products/droplets/是单独的虚拟服务器。因此,如果您正在运行 30 个单独的节点进程来初始化"相同"的 knex 实例,那么您实际上无法在它们之间共享相同的单例 knex 实例。每个节点进程初始化自己的副本。

因此,当您创建了 30 个 knex 实例并且默认情况下 knex 初始化为池大小 10 时,最多尝试创建 300 个到数据库的连接。

根据 http://knexjs.org/#Installation-client"MySQL 和 PG 库的连接池的默认设置为最小值:2,最大值:10"——将其增加到即 50 是否安全?!Knex 文档对他们的池概念解释得很差,相反,他们引用 https://github.com/vincit/tarn.js 以获取"更多详细信息",并且没有任何关于 MySQL 的细节。

没有什么MySQL要说的,也没有理由为什么knex应该复制tarn.js库(也不是mysql数据库/驱动程序(的文档。

可以安全地将其增加到数据库配置允许的任何数量。不过,在您的情况下,如果您正在运行 30 个 knex 实例,则最大连接数应比数据库硬限制少 30 倍。

处理连接同一数据库的多个 knex 进程有点复杂,我只想考虑将 mysql 服务器的连接限制提高到 500 个,或者让它能够提供 30 个液滴,每个液滴最多可以使用 10 个连接。

附言我们意识到共享数据库会导致性能问题,但我们考虑在达到数千名用户时迁移它,从常识来看,我们可以从 MySQL 中获得它。现在我们有 30+ 用户的性能问题^

共享同一个数据库可能会导致也可能不会导致性能问题...这完全取决于对数据库进行的查询类型。

相关内容

最新更新