Node.js 为什么我对mongoDB的nodejs插入会在一段时间后停止
我正在用以下代码测试我的nodejs插入到MongoDB中。当我插入大约10000行时,文件中的所有内容都正常工作。但是,如果我尝试插入类似一百万的内容,则插入操作会停止一段时间,并且不会在nodejs控制台或MongoDB上打印错误 我在下面附上我的代码和MongoDB的控制台,请帮助我,谢谢 ---更新--- 为了回答回复中的问题,我还检查了我的mongostat,然后插入停止。然而,我观察到两种现象: 1) 在我的笔记本电脑上,通过“npm install mongodb”安装mongodb解析器,“node my.js”通过以下服务器输出“server has start”启动 观察结果:插入正在进行,mongostat显示,大部分时间插入为零,但有时可以显示插入的记录 < P> 2)在我的PC上,通过“NPM注册表安装MunGDB”安装MangGDB解析器,并且“No.My.js”从以下服务器开始,“服务器已经启动。->加载C++ + BSON扩展,使用纯JS版本”失败。 观察结果:insert只运行一段时间,然后什么也没有发生,而mongostat在一段时间后始终显示零insert “npm——注册表安装mongodb”也可能是个问题吗Node.js 为什么我对mongoDB的nodejs插入会在一段时间后停止,node.js,mongodb,Node.js,Mongodb,我正在用以下代码测试我的nodejs插入到MongoDB中。当我插入大约10000行时,文件中的所有内容都正常工作。但是,如果我尝试插入类似一百万的内容,则插入操作会停止一段时间,并且不会在nodejs控制台或MongoDB上打印错误 我在下面附上我的代码和MongoDB的控制台,请帮助我,谢谢 ---更新--- 为了回答回复中的问题,我还检查了我的mongostat,然后插入停止。然而,我观察到两种现象: 1) 在我的笔记本电脑上,通过“npm install mongodb”安装mongod
我的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!");
});
您可以使用mongostat检查脚本的进度,或者查看是否发生了任何事情 打开cmd,导航到/mongodb/bin dir并执行 mongostat—主机本地主机 这将为您提供有关mongodb服务器当前情况的信息。第一列是插入操作,您必须检查这些操作。这表示每秒在数据库中插入多少项。 还可以查看“locked db”列,该列显示了数据库的写锁定百分比。更高的百分比意味着写操作速度变慢,因为有许多插入,每个插入都在等待前一个完成并解锁数据库。 还要注意,connection.insert是一种异步操作,基本上您正在尝试一次向数据库发送100万个insert请求,因为您没有等待任何insert完成。
我在10分钟前开始编写你的脚本,目前我有40万个项目我想我自己已经想通了 从Nodejs向MongoDB插入数百万数据的问题在于,Nodejs忙于生成这些记录并立即将它们发送出去。所有的百万数据立即出现,nodejs本身在一段时间后就被阻塞了,此时MongoDB还没有收到太多的插入 我通过设置一个interval方法来“摆脱”这个问题,该方法一次插入10000条记录,并每秒调用这个interval,这样nodej就有机会移动到下一个 事件发送生成的插入,然后再次开始生成插入
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;
}
}
函数createSomeInsert(){
console.log(“*开始插入另一个10K记录,当前计数:”+计数器);
var collection=dbPool.collection('gm_std_measurements_coveringindex');
变量日期=新日期();
风险价值金额=10*1000;
对于(变量i=0;i=totalTarget){
clearInterval(interval\u checkId);
console.log(“已完成插入,总计:“+计数器”);
计数器=0;
}
}
但是,我仍然不明白为什么在生成了许多插入请求之后,nodejs会被阻止,为什么大多数请求都不会在后台发送到mongodb 你在每个请求上创建一个连接,我认为连接的数量是有限的,这就是问题所在谢谢回复!我真的不明白,我认为从“mongoClient.connect”获取的“数据库”是一个连接池,循环中的“collection.insert”应该在内部重用这个连接池吗?如果我的理解是错误的,那么正确的应该是什么样子呢?嗨@d1mitar,我在问题更新中也回答了你的建议。顺便说一句,10分钟后插入400k,nodejs和mongodb是否有点慢我想我的笔记本电脑(2G i7,4G DDR3)已经证明了你的结果,而且它也有类似的结果,--真的没有我预期的那么快。如果你想插入100万条记录,你最好将它们以10万条为单位进行分组。它在我的机器上工作几秒钟。当您逐个插入项时,每次插入都会锁定数据库,这真的很糟糕。对于mongodb,通过向collection.insert方法传递一个数组,一次插入10000项要容易得多,而不是一次添加一项True!对于大规模插入现实,它应该是块插入。然而,我正在模拟的场景是在不可预测的时间内来自大量未知客户机的大量请求,这就是为什么我正在测试nodejs对MongoDB的大量单次插入的应答能力。
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;
}
}