javascript - nodeJS 和 MySql 中的连接池问题

标签 javascript mysql node.js concurrency connection-pooling

我正在使用 NodeJs 和 Mysql。 我有一个查询要将 mysql 表中的一个字段更新为:

更新消息 SET count = count + 1 WHERE msgId = 10;

我正在使用连接池。配置为:

var pool = mysql.createPool({
connectionLimit : 100,
host: config.mysql.host,
user: config.mysql.user,
password: config.mysql.password,
database: config.mysql.database,
port: 3306,
debug: false,
multipleStatements: true});

当消息传递给 500 万用户时,使用此查询的 API 起作用。 它使连接保持打开状态。这导致服务器处理速度非常慢。 是否有任何替代解决方案来提高服务器性能

最佳答案

矛盾的是,减少连接数通常会提高性能。池化连接是连续可重用的资源,并且有一个连接请求队列。因此,DBMS 不会尝试一次执行大量查询,而是一次处理较少数量的查询,并串行处理负载。

因此,对于像您这样应该运行很短时间的查询,请创建一个连接限制较小的池。尝试 10。如果效果不错,请尝试 5。

如果您有其他需要更长时间的查询,您可能需要一个不同的连接池。

更不用说集群 Node 应用程序将为集群的每个成员打开该数量的连接。 400 个连接对于几乎所有 MySQL 部署来说太多了。 (如果您的部署要处理数百个连接,您的采购经理就会知道,因为这样的部署非常昂贵。)

但是,您可能会遇到这个问题:如果数百万用户正在更新完全相同的行 msgId = 10您将对该行进行 DBMS 争用。在这种情况下,您可能希望存储该行的命中数,然后执行 UPDATE... SET count = count + n。每隔几秒一次,而不是每次点击一次。

关于javascript - nodeJS 和 MySql 中的连接池问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52536228/

相关文章:

linux - 如何确保 Node 以用户身份运行?

javascript - 如何设置 firebase 监听器只监听新添加的 child ?

node.js - 如何使用 API.AI 将对话输入传递到 webhook

javascript - 使用字符串名称访问对象成员

javascript - 我想使用不同的语法以便于调试。为什么不起作用?

Mysql 查询,我写了一个 IFNULL 条件,但它显示空白而不是不可用(我使用 phpmyadmin 4.0)

javascript - Mysql和leafletjs中的自定义图标

javascript - 如何设置指定日期bootstrap datepicker?

javascript - 创建类似 Twitter 的状态更新小部件的最简单方法

MySQL日期差异迭代查询——精简查询或优化数据结构