为什么我的nodejs插入mongoDB会在一段时间后停止

时间:2014-04-17 13:35:03

标签: node.js mongodb

我正在使用以下代码测试我的nodejs插入我的MongoDB。当我插入类似10000行的东西时,一切都工作文件。但是如果我尝试插入类似100万的内容,插入操作会停止一段时间,而在nodejs控制台和MongoDB上都没有打印出错误。

我将我的代码和控制台放在下面的MongoDB中,请帮帮我,非常感谢!!

---更新---

为了回复回复中的问题,我还检查了我的mongostat,并且插件在一段时间后停止。但是,我发现了两种现象:

1)在我的笔记本电脑上,通过" npm install mongodb"以及"节点my.js"安装mongodb解析器。以下列服务器输出启动"服务器已启动。"

观察结果:插入正在进行,mongostat显示,大多数时候插入为零,但有时插入的记录可以显示。

2)在我的电脑上,通过" npm --registry http://registry.npmjs.eu/安装mongodb"以及"节点my.js"安装mongodb解析器。以下列服务器输出启动"服务器已启动。 - >无法使用纯JS版本"

加载c ++ bson扩展

观察到的结果:插入只运行一段时间,然后没有任何反应,并且mongostat在一段时间后总是显示为零插入。

" npm --registry http://registry.npmjs.eu/可以安装mongodb"也是一个问题?


我的nodejs代码:

mongoClient.connect("mongodb://localhost:27017/testdb", { db : { native_parser : true } }, function(err, database) {

        if (err) { console.log(err.message); throw err; }

        // create new collection under database
        var collection = database.collection('gm_std_measurements_coveringindex');
        date = new Date();

        // add all Documents
        for (var i = 0; i < 1000000; i++) {
            var ranNumber = Math.floor((Math.random() * 1000) + 1);

            // insert objects after table and index creation
            var istObject = {
                fkDataSeriesId : ranNumber,
                measDateUtc : date,
                measDateSite : date,
                project_id : ranNumber,
                measvalue : ranNumber,
                refMeas : false,
                reliability : 1.0
            };

            collection.insert(istObject, { w : 1 }, function(err, docs) {
                if (err) {
                    console.log(err.message);
                    throw err;
                } else {
                    // do noting to responsed inserted Document
                }
            });
        }
        console.log("* Documents created!");
    });

MongDB服务器输出:

Thu Apr 17 15:32:18.942 [initandlisten] connection accepted from 127.0.0.1:33228 #70 (3 connections now open)
Thu Apr 17 15:32:18.949 [conn70] end connection 127.0.0.1:33228 (2 connections now open)
Thu Apr 17 15:32:18.951 [initandlisten] connection accepted from 127.0.0.1:33229 #71 (3 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33230 #72 (4 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33231 #73 (5 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33232 #74 (6 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33233 #75 (7 connections now open)
Thu Apr 17 15:32:28.520 [FileAllocator] allocating new datafile /var/lib/mongodb/testdb.2, filling with zeroes...
Thu Apr 17 15:32:28.563 [FileAllocator] done allocating datafile /var/lib/mongodb/testdb.2, size: 256MB,  took 0.042 secs
Thu Apr 17 15:32:31.517 [conn75] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:23 129ms
Thu Apr 17 15:32:31.517 [conn72] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:37 129ms
Thu Apr 17 15:32:31.517 [conn74] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:31 129ms
Thu Apr 17 15:32:31.517 [conn73] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:19 129ms

2 个答案:

答案 0 :(得分:0)

我想我已经以某种方式想出来了。

从Nodejs向MongoDB插入数百万个数据的问题在于,nodejs被生成这些记录并立即发送出去。所有数百万的数据立即出现,并且nodejs本身在一段时间后就被卡住了,而此时MongoDB还没有收到太多的传入插入。

我&#34;摆脱&#34;这个问题是通过设置一次插入10000条记录的间隔方法,每秒调用一次这个间隔,以便nodejs有机会移动到下一个 event将生成的插入发送出去,然后再次开始生成插入。

interval_checkId = setInterval(createSomeInsert, 1000);

createSomeInsert方法:

function createSomeInsert() {

    console.log("* Starting to insert another 10K records, current count: " + counter);

    var collection = dbPool.collection('gm_std_measurements_coveringindex');

    var date = new Date();
    var amount = 10 * 1000;
    for(var i = 0; i < amount; i++) {

        var ranNumber = Math.floor((Math.random() * 1000) + 1);

        // insert objects after table and index creation
        var istObject = {
            fkDataSeriesId : ranNumber,
            measDateUtc : date,
            measDateSite : date,
            project_id : ranNumber,
            measvalue : ranNumber,
            refMeas : false,
            reliability : 1.0
        };

        collection.insert(istObject, { w : 0 }, function(err, docs){
            if(err) {console.log(err); throw err;}
            counter++;
        });

    }

    if(counter >= totalTarget) {
        clearInterval(interval_checkId);
        console.log("Completed Insert, in total : " + counter);
        counter = 0;
    }
}

但是,我仍然不明白为什么在生成许多插入请求后会阻塞nodejs,以及为什么大多数都不会在后台发送到mongodb。

答案 1 :(得分:-1)

您可以使用mongostat检查脚本的进度或查看是否发生了任何事情。

打开cmd,导航到/ mongodb / bin目录并执行 mongostat --host localhost

这将为您提供mongodb服务器当前正在发生的信息。第一列是插入操作,您必须检查。这表示db中每秒插入的项目数。 还看看&#34;锁定数据库&#34;列,显示数据库的写锁定百分比。较高的百分比意味着写入操作较慢,因为有许多插入,并且每个插入等待前一个完成并解锁数据库。 另外请注意,connection.insert是异步操作,基本上你是在尝试一次向数据库发送100万个插入请求,因为你没有等待任何插入完成。 我10分钟前开始你的脚本,目前我的目标是40万件