2017-08-17 37 views
1

我得到了巨大的数据可以说100.000记录数组:插入使用SQL的NodeJS DB2

   var eData = { "id": "1001", "type": "Regular" }, 
       { "id": "1002", "type": "Chocolate" }, 
       { "id": "1003", "type": "Blueberry" }, 
       { "id": "1004", "type": "Devil's Food" } 

等等...... 当我火了以下

var db = require('/QOpenSys/QIBM/ProdData/OPS/Node6/os400/db2i/lib/db2a'); 
var DBname = "*LOCAL"; 
var dbconn = new db.dbconn(); 
dbconn.conn(DBname); 
var sqlA = new db.dbstmt(dbconn); 

eData.forEach(function(eRow, i) { 
    var sql = "INSERT INTO lib.table VALUES(xx x x x) WITH NONE" 

    sqlA.exec(sql, function(rs, err) { 
     console.log("Execute Done."); 
     console.log(err); 
    }); 
}); 

的Node.js的脚本数据将在数据库中混合。相同的ID和类型将会出现10次,但它会碰到插入记录的确切数量。

如果我更改为execSync,则结果都是正确的,但接缝有点慢。我错过了什么做异步插入?

做巨大插入的最快方法是什么?

回答

1

在任何时候都会有最佳数量的异步操作进行处理。限制异步操作​​数量的最简单方法是使用出色的async.js模块。

https://caolan.github.io/async/docs.html#eachLimit

var async = require('async') 
var db = require('/QOpenSys/QIBM/ProdData/OPS/Node6/os400/db2i/lib/db2a'); 
var DBname = "*LOCAL"; 
var dbconn = new db.dbconn(); 
dbconn.conn(DBname); 
var sqlA = new db.dbstmt(dbconn); 

async.eachLimit(eData, 100, function(eRow, cb) { 
    var sql = "INSERT INTO lib.table VALUES(xx x x x) WITH NONE" 

    sqlA.exec(sql, function(rs, err) { 
     console.log("Execute Done."); 
     cb(err) 
    }); 
}, function (error) { 
    if (error) { 
     console.error(error) 
    } else { 
     console.log('Done') 
    } 
}) 
+0

很抱歉,这dosnt帮助我。即使只插入10条记录,也会混淆DB中的数据。 – AP87