knex.js默认最大池导致错误:er\u con\u count\u错误:连接太多

mznpcxlj  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(672)

我们有30个digitalocean droplets,每个都是针对web crm用户的,他们与knex.js共享同一个mysql数据库。由于几乎没有其他用户,我们得到了错误:
“er\u con\u count\u错误:连接太多”
“knex:获取连接超时。游泳池可能满了。您是否错过了一个.transacting(trx)电话?”
“包坏了。获取:1应为:0“
mysql托管在独立的服务器上,内存为4gb,有大量的空闲内存和cpu(超过50%)。
在我们的nodejs应用程序中,knex被称为singleton:

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-客户端“对于mysql和pg库,连接池的默认设置为min:2,max:10”-将其增加到50安全吗?!knex文档没有很好地解释他们的池概念,而是引用了https://github.com/vincit/tarn.js 对于“更多细节”,没有任何关于mysql的细节。
非常感谢您的帮助。
p、 我们意识到共享数据库会导致性能问题,但我们正在考虑当我们接触到成千上万的用户时进行迁移,从常识上讲,这是我们对mysql的期望。现在我们有30多个用户的性能问题。

hgtggwj0

hgtggwj01#

我们有30个digitalocean droplets,每个都是针对web crm用户的,他们与knex.js共享同一个mysql数据库。由于几乎没有其他用户,我们得到了错误:
如果我在这里理解正确的话https://www.digitalocean.com/products/droplets/ 是独立的虚拟服务器。因此,如果您正在运行30个单独的节点进程来初始化“相同”的knex示例,那么就不可能在它们之间实际共享同一个单例knex示例。每个节点进程初始化它自己的副本。
因此,当您创建了30个knex示例并且默认情况下knex以池大小10初始化时,将尝试创建最多300个到db的连接。
根据http://knexjs.org/#installation-客户端“对于mysql和pg库,连接池的默认设置为min:2,max:10”-将其增加到50安全吗?!knex文档没有很好地解释他们的池概念,而是引用了https://github.com/vincit/tarn.js 对于“更多细节”,没有任何关于mysql的细节。
没有什么特别的mysql要说,也没有理由为什么knex应该复制 tarn.js 库(或mysql数据库/驱动程序)文档。
可以安全地将其增加到数据库配置允许的任何数字。尽管在您的情况下,如果您运行30个knex示例,最大连接数应该比数据库硬限制少30倍。
处理连接同一个数据库的多个knex进程有点复杂,我只想考虑将mysql服务器的连接限制提高到500个或更多,以便它能够为您的30个水滴提供服务,每个水滴最多可能使用10个连接。
p、 我们意识到共享数据库会导致性能问题,但我们正在考虑当我们接触到成千上万的用户时进行迁移,从常识上讲,这是我们对mysql的期望。现在我们有30多个用户的性能问题^
共享同一个数据库可能会或可能不会导致性能问题。。。这完全取决于对数据库进行何种类型的查询。

相关问题