2016-11-05 2 views
0

Ich benutze die npm mysql-Bibliothek. (Ziemlich neu zu mysql) Ich habe ein Skript, das ich laufe, das Daten in eine mysql Tabelle einfügt. Aus irgendeinem Grund treten einige Verbindungen jedoch nach einigen Einfügungen aus. Ich bekomme diese Fehlermeldung:mysql Verbindungstimeout beim Einfügen in die Datenbank (node.js)

{ Error: connect ETIMEDOUT 
at PoolConnection.Connection._handleConnectTimeout (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/Connection.js:425:13) 
at Socket.g (events.js:286:16) 
at emitNone (events.js:86:13) 
at Socket.emit (events.js:185:7) 
at Socket._onTimeout (net.js:334:8) 
at tryOnTimeout (timers.js:232:11) 
at Timer.listOnTimeout (timers.js:202:5) 
-------------------- 
at Protocol._enqueue (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/protocol/Protocol.js:141:48) 
at Protocol.handshake (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/protocol/Protocol.js:52:41) 
at PoolConnection.connect (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/Connection.js:136:18) 
at Pool.getConnection (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/Pool.js:48:16) 
at Pool.query (/Users/max/projects/stock-news-angular/node_modules/mysql/lib/Pool.js:200:8) 
at Object.<anonymous> (/Users/max/projects/stock-news-angular/app/scraper.js:90:34) 
at initialize.exports.each (/Users/max/projects/stock-news-angular/node_modules/cheerio/lib/api/traversing.js:300:24) 
at /Users/max/projects/stock-news-angular/app/scraper.js:82:29 
at Array.forEach (native) 
at /Users/max/projects/stock-news-angular/app/scraper.js:75:21 

ErrorNo: 'ETIMEDOUT', Code: 'ETIMEDOUT', syscall: 'connect', fatal: true}

Wenn ich meine MySQL-Datenbank suchen, es sieht so aus:

.... some data 
    +------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+---------------------------+ 
    12131 rows in set (0.09 sec) 

So sieht es aus wie eine Reihe von Zeilen erfolgreich hinzugefügt werden, aber immer noch viele werden nicht hinzugefügt. Hier ist der Code zum Erstellen der Verbindung - ich verwende eine gepoolte Verbindung (nicht sicher, ob das richtig ist), da ich dachte, dass ich viele Abfragen ausführen musste, also würde ich sie einfach zusammenlegen. Die Erklärung des Pools:

 var pool = mysql.createPool({ 
     host: 'localhost', 
     user: 'root', 
     password: 'secret', 
     database: 'stock_news' 
    }); 

Und die Abfrage:

 pool.query({sql: 'INSERT INTO major_news SET ?', timeout:40000, values: post}, function(err, result) { 
     if (err) 
      console.log(err); 
     }); 

Vielleicht verstehe ich nicht mysql gut genug, aber ich bin mir nicht sicher, warum die Verbindung nach einer gewissen Zeit einer Zeitüberschreitung ist. Ich habe das Timeout bereits auf 40000ms erhöht, also denke ich, dass es etwas anderes sein könnte, das ich nicht sehe.

+0

Machst du den pool.query Teil in einer Schleife? –

+0

@HolgerWill Ja, ich bin. – needhelpwithR

+0

das könnte das Problem sein, Sie bitten um viele Verbindungen aus dem Pool virtuell zur gleichen Zeit. Sie könnten Masseneinfügungen verwenden ... siehe http://StackOverflow.com/Questions/8899802/How-Do-I-Do-Abulk-Insert-in-Mysql-using-Node-Js –

Antwort

0

Erhalten Sie die Poolverbindung, bevor Sie die pool.query durchführen?

var mysql = require('mysql'); 
var pool = mysql.createPool({ 
    host  : 'example.org', 
    user  : 'bob', 
    password : 'secret', 
    database : 'my_db' 
}); 

pool.getConnection(function(err, connection) { 
    // connected! (unless `err` is set) 
    // queries here, when all queries are finished you do connection.release() to return the connection back to the pool 
}); 

Möglicherweise müssen Sie das Verbindungsobjekt für eine andere Funktion zu übergeben und einen Rückruf tun, wenn alle Anfragen (zum Lösen der Verbindung) durchgeführt werden, da die Verbindung nicht an den Pool Lösen die Verbindung zu dem schließlich schließen Server.

+0

Sie nicht Sie müssen 'pool.getConnection()' verwenden, wenn Sie 'pool.query()' verwenden. – robertklep