2016-11-05 43 views
0

我正在使用npm mysql庫。 (很新的MySQL)我有一個腳本,我正在運行,將數據插入到MySQL表中。但是,由於某些原因,某些連接在某些插入後超時。我得到這個錯誤:插入數據庫時​​mysql連接超時(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', 代碼: 'ETIMEDOUT', 系統調用: '連接', 致命的:真正}

當我看着我的MySQL數據庫,它看起來是這樣的:

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

所以它看起來像一堆行被成功添加,但仍有許多不添加。這裏是創建連接的代碼 - 我使用的是連接池(不知道這是否正確),因爲我認爲我必須做很多查詢,所以我只是將它們集中在一起。池的聲明:

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

和查詢:

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

也許我不明白MySQL的不夠好,但我不知道爲什麼連接一段時間後超時。我已經把超時時間增加到了40000ms,所以我想這可能是其他的東西,我沒有看到。

+0

你在做循環中的pool.query部分嗎? –

+0

@HolgerWill是的。 – needhelpwithR

+0

這可能是問題,您正在同時請求池中的多個連接。 您可以使用批量插入...請參閱http://stackoverflow.com/questions/8899802/how-do-i-do-a-bulk-insert-in-mysql-using-node-js –

回答

0

在進行pool.query之前,您是否已獲取泳池連接?

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

您可能需要通過連接對象的其他功能,做一個回調時,所有查詢完成(釋放連接),因爲沒有釋放到池中的連接將最終關閉涉及的連接服務器。

+0

你不如果你使用'pool.query()',需要使用'pool.getConnection()'。 – robertklep