2015-01-02 20 views
5

Jestem początkującym w węźle. Poniżej znajduje się kod, który próbuję wykonać za pomocą węzła mysql ale trzyma daje mi ten błąd:ER_CON_COUNT_ERROR: Zbyt wiele błędów połączenia w węźle-mysql

error connecting: Error: ER_CON_COUNT_ERROR: Too many connections 

:: KOD ::

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

Jak należy ponownie zaprojektować powyższy kod z powodzeniem go wykonać?

Odpowiedz

1

Po pierwsze nie potrzebujesz 1500 połączeń do wstawienia 1500 elementów. Usuń ten kod z pętli for.

coś takiego:

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 domyślnie akceptuje tylko 100 jednoczesnych połączeń max. W twoim przypadku tworzysz ~ 1500, więc otrzymany błąd jest normalny. Możesz zwiększyć tę wartość, ale problem tutaj jest w twoim kodzie.

Zamiast tego należy użyć puli. Spowoduje to, że węzeł utworzyć pulę połączeń (myślę, że domyślnie jest 10) i pozwolić im być udostępniane przez Państwa pytania:

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

Ponadto można rozważyć użycie jednego połączenia i włóż wszystko naraz. Możesz zobaczyć w this odpowiedź, jak to osiągnąć.

Powiązane problemy