2015-01-02 3 views
5

Я новичок. Ниже приведен код, который я пытаюсь выполнить с помощью узла MySQL, но он продолжает давать мне эту ошибку:ER_CON_COUNT_ERROR: Слишком много ошибок подключения в узле-mysql

error connecting: Error: ER_CON_COUNT_ERROR: Too many connections 

:: КОД ::

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); 
     } 
    }); 
} 

Как я должен заново проектировать приведенный выше код успешно выполнить его?

ответ

1

Прежде всего вам не нужно 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); 
     } 
    }); 
}; 
4

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(); 
      }); 
     }); 
    } 

Кроме того, вы можете рассмотреть возможность использования одного подключения и вставить все сразу. Вы можете видеть в this ответ, как этого достичь.

Смежные вопросы