在插入大量数据时关闭node.js中的mongodb连接

2024-01-05

我正在尝试编写一个程序来解析 iis 日志数据并将其插入到 mongodb 中。文件不是那么大,大约 600 行。试图说服我的管理 Nodejs 和 mongodb 比 .net 和 sql server 更好:)。
在nodejs中看一下下面的代码。逻辑:我解析每一行并转换为json并将保存插入db中。我正在使用 mongonative 驱动程序。
问题:即使在将所有行插入数据库之前,数据库连接也会关闭。
我看到日志文件有 6000 行,但 db 中的记录数只有 arnd 4000。我理解这是nodejs的异步特性,在这我如何以更确定的方式关闭连接(在检查是否插入了所有行之后)?

var MongoClient = require('mongodb').MongoClient;
var mongoServer = require('mongodb').Server;
var serverOptions = {
    'auto_reconnect': true,
    'poolSize': 5
};

var fs = require('fs');
var readline = require('readline');

var rd = readline.createInterface({
    input: fs.createReadStream('C:/logs/Advisor_Metrics/UI/P20VMADVSRUI01/u_ex130904.log'),
    output: process.stdout,
    terminal: false
});
var mongoClient = new MongoClient(new mongoServer('localhost', 27017, serverOptions));
var db = mongoClient.db('test');
var collection = db.collection('new_file_test');
var cntr = 0;
mongoClient.open(function (err, mongoClient) {
    console.log(err);
    if (mongoClient)
    {        
        rd.on('line', function (line) {
            if (line.indexOf('#') == -1) {
                var lineSplit = line.split(' ');
                var data =
                {
                    d: lineSplit[0],
                    t: lineSplit[1],
                    sip: lineSplit[2],
                    met: lineSplit[3],
                    uri: lineSplit[4],
                    cip: lineSplit[8],
                    cua: lineSplit[9],
                    stat: lineSplit[10],
                    tt: lineSplit[13]
                };

                collection.insert(data, function (err, docs) {
                    console.log('closing connection');
                    //db.close();
                });
            }
        });
    }
})
rd.on('close', function () {
    db.close();
});

Sol 1:解决方案是解析 json 对象并添加到数组中,然后将数组添加到 mongodb。我不想这样做,因为这想将整个巨大的日志文件解析到内存中!,还有其他解决方案吗?


我 100% 确定,但据我所知,您正在同步插入数据。我的意思是,一旦你得到一行,你就会尝试插入它,而不是等待结果。尝试使用另一种方法:

  • 读取所有行并将它们存储在数组中
  • 开始异步逐行插入数据

像这样的东西:

var lines = [];
var readAllLines = function(callback) {
    // store every line inside lines array
    // and call the callback at the end
    callback();
}
var storeInDb = function(callback) {
    if(lines.length === 0) {
        callback();
        return;
    }
    var line = lines.shift();
    collection.insert(line, function (err, docs) {
        storeInDb(callback);
    });
}

mongoClient.open(function (err, mongoClient) {
    console.log(err);
    if (mongoClient) {
        readAllLines(function() {
            storeInDb(function() {
                // lines are inserted
                // close the db connection
            })
        });
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在插入大量数据时关闭node.js中的mongodb连接 的相关文章

随机推荐