0


我正在研究使用 node-mongodb-native 模块在 mongoDb 数据库中插入文档的功能。一切正常,除非我连续调用插入多个文档。我使用for循环来测试我的函数如何同时对多个文档插入做出反应。

var server = new Server("xxx.xxx.xxx.xxx", 27017, {auto_reconnect: true, poolSize: 100});
var db = new Db("testDb", server, {safe: false}); 

module.exports.insert = function(document){
    var database;

    function db_open(err, db_local){
        if(err) throw err;
        database = db_local;
        database.collection("rooms", handle_insert);
    }
    function handle_insert(err, collection){
        if(err) throw err;
        collection.insert(document);
        database.close();
    }
    db.open(db_open);
};

for(var i=0; i<100; i++){
    module.exports.insert({name : "test"});
}

当我运行这段代码时,我得到了错误为了解决这个问题,db object already connecting, open cannot be called multiple times 我决定在每次调用函数时创建一个新的实例:ServerDb

module.exports.insert = function(document){
    var database;
    var server = new Server("xxx.xxx.xxx.xxx", 27017, {auto_reconnect: true, poolSize: 100});
    var db = new Db("testDb", server, {safe: false}); 

    function db_open(err, db_local){
        if(err) throw err;
        database = db_local;
        database.collection("rooms", handle_insert);
    }
    function handle_insert(err, collection){
        if(err) throw err;
        collection.insert(document);
        database.close();
    }
    db.open(db_open);
};

for(var i=0; i<100; i++){
    module.exports.insert({name : "test"});
}

但是现在我connection closed被 db_open 函数抛出了,我真的不明白为什么我的连接在我创建的那一刻db和我的代码调用的那一刻之间关闭db_open
你知道发生了什么吗?

谢谢 :)

(对不起,如果我的英语不是很好)

编辑 我发现这个网站解释说问题是由太长的 tcp_keepalive 时间引起的。这个解决方案的问题是我的工作站(Cloud 9)。我无权访问文件 /proc/sys/net/ipv4/tcp_keepalive_time

4

1 回答 1

1

我认为您的问题与 TCP 保持活动无关。就像错误消息说的那样,您只是试图多次打开同一个连接(每次调用 insert 方法时)。而不是open()每次都调用,只需调用一次,并确保回调返回,然后再insert()第一次调用。您可以在同一连接上执行的同时插入的数量没有硬性限制,因为它都是异步的。

于 2013-06-27T23:11:53.817 回答