Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS操作顺序_Javascript_Sql_Node.js_Mongodb - Fatal编程技术网

Javascript NodeJS操作顺序

Javascript NodeJS操作顺序,javascript,sql,node.js,mongodb,Javascript,Sql,Node.js,Mongodb,我试图创建一个NodeJS应用程序来提取SQL记录并将它们插入MongoDB。我感兴趣的表有点大,有100多万条记录。对于小于200000的小数据集,我的应用程序工作得很好,但在满表的情况下运行会消耗RAM,并使服务器陷入爬行状态 看起来节点正在运行我的for循环,为每个SQL子选择分支进程,然后运行MongoDB更新 我从未见过Mongo连接!直到最后一次获取活动响应写入屏幕 #!/var/node/bin/node var odbc = require("odbc"); var db = n

我试图创建一个NodeJS应用程序来提取SQL记录并将它们插入MongoDB。我感兴趣的表有点大,有100多万条记录。对于小于200000的小数据集,我的应用程序工作得很好,但在满表的情况下运行会消耗RAM,并使服务器陷入爬行状态

看起来节点正在运行我的for循环,为每个SQL子选择分支进程,然后运行MongoDB更新

我从未见过Mongo连接!直到最后一次获取活动响应写入屏幕

#!/var/node/bin/node
var odbc = require("odbc");
var db = new odbc.Database();

var MongoClient = require('mongodb').MongoClient;
var format = require('util').format;

db.open("DSN=<DSN>;SERVER=<SERVER>;DATABASE=<DB>;UID=<UID>;PWD=<PWD>", function (err) {
   if(err) throw err;
   console.log("SQL Connected!");

      var sqlstr = "SELECT TOP 1000 * FROM tbl_A NOLOCK";
      console.log("Executing '" + sqlstr + "' against SQL Server");

      db.query(sqlstr, function (sql1err, rows, moreResults) {
         if (sql1err) throw sql1err;

         for (var i = 0; i < rows.length; i++) {
            InsertActivity(db, rows[i], i, rows.length, function () {});
         }
      });
});

function InsertActivity(sql, activity, cur, total, callback) {
   console.log("Getting Responses for Activity #" + activity.ActivityID);
   var rsql = "SELECT * FROM tbl_Responses NOLOCK WHERE ActivityID = " + activity.ActivityID;
   sql.query(rsql, function (sqlerr, rows, moreResults) {
      if (sqlerr) console.log(sqlerr);
      activity.resonses = rows;

      MongoClient.connect('mongodb://localhost:27017/m', function (merr, mdb) {
         console.log("Mongo Connected!");
         mdb.collection("activity").insert(activity, function () {
            console.log("Inserted Activity #" + activity.ActivityID + " inserted into Mongo");
            mdb.close(function () { console.log("Mongo Disconnected!"); });
            callback();
         });
      });

      if (cur == total - 1) sql.close(function () { console.log("SQL Disconnected!"); });
   });

   console.log(rsql);
}

不幸的是,您需要的是一个未记录的函数,我将修复它。函数是db.queryResult,它返回允许您单独获取行的结果对象。这将避免将整个结果集缓冲到内存中

var db = require('odbc')();

db.open(connectionString, function (err) {
    db.queryResult('select * from tbl_A NOLOCK', function (err, result) {
        fetchMore();

        function fetchMore() {
            result.fetch(function (err, data) {
                if (!data) {
                    //we're all done, clean up
                }

                doStuffWithData(data, function (err) {
                    fetchMore();
                });
            });
        }
    });
});

function doStuffWithData(data, cb) {
    //do stuff
    cb(null);
}