2016-02-19 3 views
4

Это простой файл из мангустов краткое руководствоПочему мангуста открывает два соединения?

mongoose.js

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/Chat'); 

var userSchema = mongoose.Schema({ 
    name: String 
}); 

var User = mongoose.model('User', userSchema); 
var user = new User({name: 'Andy'}); 

user.save(); // if i comment it mongoose will keep one connection 

User.find({}, function(err, data) { console.log(data); }); // the same if i comment it 

Я пытался использовать db.once метод, но эффект тот же.

Почему мангуста открывает второе соединение в этом случае?

mongodb

ответ

5

Mongoose использует собственный драйвер Монго снизу, а это в свою очередь, использует пул соединений - Я считаю, что по умолчанию 5 подключений (Проверьте here).

Таким образом ваше соединение мангуста будет использовать до 5 одновременных соединений, если у него есть одновременные запросы.

И так как оба user.save и User.find являются асинхронными, они будут выполняться одновременно. Так что ваша «программа» говорит узел:

1. Ok, you need to shoot a `save` request for this user. 
2. Also, you need to fire this `find` request. 

Среда узел считывает эти, не проходит через всю вашу функцию (пока return). Затем он смотрит на это ноты:

  • я должен был назвать это save
  • мне нужно вызвать этот find
  • Эй, Монго родной драйвер (который написан на C++) - вот две задачи для тебя!
  • , а затем гонщик mongo отправляет первый запрос. И он видит, что разрешено открывать больше подключений, затем один, так и есть, а также запускает второй запрос, не дожидаясь завершения первого.

Если вы назвали find внутри обратного вызова для save, было бы последовательным, и водитель, вероятно, повторно использовать соединение это уже было.

Пример:

// open the first connection 
user.save(function(err) { 

    if (err) { 

    console.log('I always do this super boring error check:', err); 
    return; 
    } 
    // Now that the first request is done, we fire the second one, and 
    // we probably end up reusing the connection. 
    User.find(/*...*/); 
}); 

Или подобное с обещаниями:

user.save().exec().then(function(){ 
    return User.find(query); 
}) 
.then(function(users) { 
    console.log(users); 
}) 
.catch(function(err) { 
    // if either fails, the error ends up here. 
    console.log(err); 
}); 

Кстати, вы можете сказать, мангуст использовать только одно соединение, если вам нужно, по какой-то причине:

let connection = mongoose.createConnection(dbUrl, {server: {poolSize: 1}}); 

Это было бы его сутью.

Подробнее о MongoLab blog и Mongoose website.

+1

Спасибо за удивительное объяснение! –

+0

Хотелось бы добавить, что для клиента нет ничего необычного пула подключений _much_ больше, чем сотни или даже тысячи. –

+0

@MarkusWMahlberg возможно, но я думал, что _client_ с сотнями соединений будет не так часто. Думаю, зависит от прецедента. – Zlatko

Смежные вопросы