【发布时间】:2016-05-29 11:49:42
【问题描述】:
我正在试验 mongodb-async 驱动程序 (http://mongodb.github.io/mongo-java-driver/3.0/driver-async/) 并注意到奇怪的行为。我在底层代码中重现了奇怪的行为:
import com.mongodb.async.SingleResultCallback;
import com.mongodb.async.client.MongoClient;
import com.mongodb.async.client.MongoClients;
import com.mongodb.async.client.MongoCollection;
import com.mongodb.async.client.MongoDatabase;
import org.bson.Document;
public class main {
public static void main(String [] args)
{
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("mongotest");
MongoCollection<Document> collection = database.getCollection("coll");
for(Integer i = 0; i < 100000; i++) {
Document doc = new Document("name"+ i.toString(), "TESTING");
collection.insertOne(doc, new SingleResultCallback<Void>() {
public void onResult(final Void result, final Throwable t) {
System.out.println("Inserted!");
}
});
}
while(true){
}
}
}
我希望这段代码将 100.000 个文档插入到名为“mongotest”的 mongo 数据库的集合“coll”中。 但是,当我在运行此代码后检查元素数量时,丢失了数千个文档。
在 mongodb-shell 中运行此语句时
db.getCollection("coll").count()
结果我得到 93062。这个数字因每次运行而异,但永远不会达到 100.000。任何人都可以解释为什么当我使用此代码时,为什么不是所有对象都正确存储为 MongoDB 中的文档?我们在 3 台不同的机器上对此进行了测试,每台机器都表现出相同的行为。
我觉得这是一个与驱动程序相关的问题,因为在此之后我使用 node.js 编写了一个类似的实验:
var express = require('express');
var MongoClient = require('mongodb').MongoClient;
var app = express();
var url = 'mongodb://localhost:27017/mongotest';
MongoClient.connect(url, function (err, db) {
for (var i = 0; i < 100000; i++) {
var name = "name" + i;
db.collection("coll").insertOne({
name: name
},function(err,results) {
if(err==null) {
console.log("Sweet");
}
});
}
});
module.exports = app;
与 java 代码相比,此代码的运行时间更长,但当代码完成时,集合中的文档数量符合预期。
谁能解释为什么java-example不是这种情况,并可能提供解决方案?
【问题讨论】:
标签: java node.js mongodb asynchronous