ER_CON_COUNT_ERROR:node-mysql中的连接错误太多

u13*_*211 10 javascript mysql node.js

我是节点初学者.以下是我尝试使用节点mysql执行的代码,但它一直给我这个错误:

error connecting: Error: ER_CON_COUNT_ERROR: Too many connections
Run Code Online (Sandbox Code Playgroud)

::码::

var size = item.length;// size is ~1500
for (var i=0; i<size;i++) {
    var connection = mysql.createConnection({
        host     : 'xxx.xxx.xxx.xxx',
        database : 'mydb',
        user     : 'test',
        password : 'test'
    });

    connection.connect(function(err, callback) {
        if (err) {
            console.error('error connecting: ' + err.stack);
            return;
        }
    });

    var entry = {
        id: item[i],
        time_created: Math.floor(Date.now() / 1000),
        time_created: Math.floor(Date.now() / 1000),
        price_range: 0
    };


    var query = connection.query('INSERT INTO mytable SET ?', entry, function(err, result, callback) {
        if(err) {
            console.log(err.message);
        }
    });

    connection.end(function(err) {
        if(err) {
            console.log(err.message);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我应该如何重新设计上面的代码才能成功执行它?

Sal*_*lem 12

默认情况下,MySQL最多只接受100个并发连接.在你的情况下,你正在创建~1500,所以你得到的错误是正常的.您可以增加此值,但问题出在您的代码中.

你应该使用游泳池.这将使节点创建一个连接池(我认为默认值为10)并让它们由您的查询共享:

    var mysql = require('mysql');
    var pool  = mysql.createPool({
        host     : 'xxx.xxx.xxx.xxx',
        database : 'mydb',
        user     : 'test',
        password : 'test'
    });
    for (var i=0; i<size;i++) {
        pool.getConnection(function(err, connection) {
          connection.query( 'INSERT INTO ...', function(err, rows) {
            connection.release();
          });
        });
    }
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用单个连接并一次插入所有内容.你可以在这个答案中看到如何实现这一目标.


Chi*_*ain 8

首先,您不需要 1500 个连接来插入 1500 个项目。从 for 循环中删除该代码。

像这样的东西:

var size = item.length;// size is ~1500
var connection = mysql.createConnection({
    host     : 'xxx.xxx.xxx.xxx',
    database : 'mydb',
    user     : 'test',
    password : 'test'
});

connection.connect(function(err, callback) {
    if (err) {
        console.error('error connecting: ' + err.stack);
        return;
    }
});

connection.end(function(err) {
    if(err) {
        console.log(err.message);
    }
});

for (var i=0; i<size;i++) {
    var entry = {
        id: item[i],
        time_created: Math.floor(Date.now() / 1000),
        time_created: Math.floor(Date.now() / 1000),
        price_range: 0
    };


    var query = connection.query('INSERT INTO mytable SET ?', entry, function(err, result, callback) {
       if(err) {
          console.log(err.message);
       }
    });
};
Run Code Online (Sandbox Code Playgroud)