【问题标题】:Getting mysql:"Too many connections" despite using createPool in NodeJs获取 mysql:"Too many connections" 尽管在 NodeJs 中使用 createPool
【发布时间】:2019-05-20 16:06:05
【问题描述】:

我正在使用 Observables 在 Angular2+ 应用程序中显示实时数据,后端是用使用 MySQL 数据库的 NodeJs 编写的。由于我使用的是 Observables,我需要数以千万计的 MySQL 连接来保持实时工作的进行。

但是不可能获得这么多的连接。因此,我使用了从连接池创建连接的池。但是,我无法实现它。我仍然收到错误:

错误:ER_CON_COUNT_ERROR:连接太多”

如何关闭我的连接,以免连接数超过?

前端代码:

angular.component.ts

Observable.interval(10000).subscribe(x => {

  this.viewData(Val);

  // more functions

  console.log(" Observable")
});

NodeJS 代码:

dashboard.service.js

function viewData(data) {

    var sqlQuery = `
    select * from TRANSACTION_PAYLOAD where INTERFACE_NAME = 'Highmark' AND (STATUS ='SUCCESS_RESPONSE')`

    var deferred = Q.defer();
    console.log("INSIDE NODE JS SERVICE");

    var host = config.host;
    var user = config.user;
    var password = config.password;
    var database = config.database;

    var con = mysql.createPool({
        host: host,
        user: user,
        password: password,
        database: database
    });

    con.getConnection(function (err) {
        console.log("Inside .getConnection ")

        if (err) deferred.reject(err.name + ': ' + err.message);

        con.query(sqlQuery,
            function (err, result, fields) {
                if (err) deferred.reject(err.name + ': ' + err.message);


                console.log(result);
                deferred.resolve(result);
            });
    });
    return deferred.promise; 
    con.close();
}

【问题讨论】:

  • 每次执行viewData 时,您似乎都在创建一个新池。这个想法是为所有viewData 和其他数据库操作使用单个连接池。
  • 允许的连接数由 max_connections 系统变量控制。当 MySQL 与 Apache Web 服务器一起使用时,默认值为 151 以提高性能。要支持更多连接,请将 max_connections 设置为更大的值。 mysqld 实际上允许 max_connections + 1 个客户端连接。额外的连接保留给拥有 SUPER 权限的帐户使用。 [dev.mysql.com/doc/refman/5.5/en/too-many-connections.html]
  • @William ...您能否建议如何为所有 viewData 使用单个连接池?

标签: mysql node.js angular promise connection-pooling


【解决方案1】:

您正在为每个请求创建 mysql 池。你应该有一个连接池。

连接池自动管理与 mysql 服务器的连接。

你需要从你的函数中取出连接池初始化。

把连接拔掉

const mysqlConOptions = {
    host: host,
    user: user,
    password: password,
    database: database
};
var conPool = mysql.createPool(mysqlConOptions);

在你的函数内部,

conn = await conPool.getConnection();

【讨论】:

  • 和 conPool ...基本上在 pooling 中,即使我们没有结束连接。即 conPool.close() 不执行......它仍然可以工作吗?即它不会给 mysql - Too many connections 错误?
猜你喜欢
  • 2014-10-14
  • 2011-07-15
  • 1970-01-01
  • 2015-06-09
  • 2022-10-05
  • 2020-04-25
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多