Множественные подключения с node-mongodb-native


Я работаю над функцией вставки документа в базу данных mongoDb с использованием модуля node-mongodb-native. Все работает, кроме случаев, когда я вызываю вставку нескольких документов подряд. Я использую цикл 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 Чтобы решить проблему, я решил создавать новый экземпляр Server и Db при каждом вызове функции:

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


person Maxime    schedule 27.06.2013    source источник


Ответы (1)


Я не думаю, что ваша проблема имеет какое-либо отношение к TCP keep-alive. Как говорится в сообщении об ошибке, вы просто пытаетесь открыть одно и то же соединение несколько раз (каждый раз, когда вызывается метод вставки). Вместо того, чтобы вызывать open() каждый раз, просто вызовите его один раз и убедитесь, что обратный вызов вернется, прежде чем вызывать insert() в первый раз. Жестких ограничений на количество одновременных вставок, которые вы можете выполнять в одном и том же соединении, нет, поскольку все они асинхронны.

person Bret Copeland    schedule 27.06.2013