Javascript Node.js MongoDB在写入锁定到位时返回0个文档
我有一个运行的简单节点服务器,它查询mongoDB并将文档返回给客户端进行处理。在后台,我有一个java应用程序,它从各种来源捕获数据,并作为批处理过程写入mongoDB实例。java应用程序还根据需要更新mongoDB实例中的记录。java应用程序大约每分钟执行一次,通常包括大约500个插入和1000个更新 Node.JS:Javascript Node.js MongoDB在写入锁定到位时返回0个文档,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个运行的简单节点服务器,它查询mongoDB并将文档返回给客户端进行处理。在后台,我有一个java应用程序,它从各种来源捕获数据,并作为批处理过程写入mongoDB实例。java应用程序还根据需要更新mongoDB实例中的记录。java应用程序大约每分钟执行一次,通常包括大约500个插入和1000个更新 Node.JS: var MongoClient = require('mongodb').MongoClient; var collection = ''; MongoClient.co
var MongoClient = require('mongodb').MongoClient;
var collection = '';
MongoClient.connect('pathToMongo', function(err, db){
collection = db.collection('mycollection');
});
...
app.get('/getData', function(req, res){
collection.find(queryString, {_id: 0, createdAt: 0}).sort({EVENTTIME:-1}).toArray(function(err,docs){
if (err){
console.log(err);
res.send(500,err);
} else {
res.json(docs);
}
});
});
Java代码片段(假设我已经在result
中插入/更新了所有数据,并且有到mongoDB的有效连接):
java Mongo实例的初始化:
MongoClient mongoClient;
DB db;
DBCollection coll = null;
try{
mongoClient = new MongoClient('localhost", 27017);
db = mongoClient.getDB("test");
coll = db.getCollection("mycollection");
} catch (Exception e){
System.out.println("Mongo Error.");
System.exit(0);
}
final DBCollection newColl = coll;
doWork(newColl); //call to method above
我的节点服务器返回我大部分时间期望的文档的确切数量(因此这不是查询问题)。但是,查询偶尔会遇到写锁(在mongod上用db.currentOp()
验证,在Node.js服务器上用db.collection('$cmd.sys.inprog').findOne
验证),并返回0个文档。这是一个问题,因为我将此计数用于度量,并且需要某种方法来确保查询的完整性(可能是0个文档)。在Node.js的mongoDB包中是否有什么东西在写锁定到位时会尝试重试
我正在运行MongoDB v2.6、mongo java驱动程序v2.12.3和Node.js v0.10.29
2014年12月31日更新:
我正在使用的mongoDB查询(上面引用为“queryString”):
我应该注意到,99%的情况下,这个查询是完美的。我将有一些实例,在这些实例中,我按预期每分钟返回12个文档,持续数小时。然后,出于某种原因(我假设写锁阻止读取),我将返回0个文档
“有时出现”currentOp(仅为插入):
你的诊断对我来说没有多大意义-你正在发送单号搜索、更新和一些插入。因此,任何内容都不应该被写锁阻止很长时间。此外,如果由于写锁定而超时,则查询不应返回0,这只是错误的行为。您是否可以包括
currentOp
信息和实际的查询,并对其进行解释,尤其是得到0个结果的查询?代码看起来没什么问题,但它显然是从真实的东西修改过来的。@wdberkeley,更新了。@wdberkeley,我的更新回答了你的问题了吗?
MongoClient mongoClient;
DB db;
DBCollection coll = null;
try{
mongoClient = new MongoClient('localhost", 27017);
db = mongoClient.getDB("test");
coll = db.getCollection("mycollection");
} catch (Exception e){
System.out.println("Mongo Error.");
System.exit(0);
}
final DBCollection newColl = coll;
doWork(newColl); //call to method above
[{"$or", [{"PRI":{"$gte":"1","$lte":"9"}}]},{"EVENTTIME":{"$gte":"2014:12:31::16:59:18"}}]
"opid" : 71715202,
"active" : true,
"secs_running" : 0,
"microsecs_running" : NumberLong(251),
"op" : "insert",
"ns" : "test.mycollection",
"insert" : {
"_id" : ObjectId("54a429a2880cc7fb7d2236465"),
"altID" : "999999",
"PRI" : "9",
"EVENTTIME" : "2014:12:31::17:55:12",
"LAT" : "0",
"LON" : "0",
"createdAt" : ISODate("2014-12-31T16:51:46.250Z")
},
"client" : "127.0.0.1:60750",
"desc" : "conn171",
"connectionId" : 171,
"locks" : {
"^" : "w",
"^test" : "W"
},
"waitingForLock" : false,
"numYields" : 0,
"lockStats" : {
"timeLockedMicros" : {
},
"timeAcquiringMicros" : {
"r" : NumberLong(0),
"w" : NumberLong(3)
}
}