2016-11-05 44 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