2015-01-02 42 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的答案中看到如何实现这一点。