2015-06-23 106 views
2

在以下代碼中,mongoClient.connect調用(默認情況下)打開一個由5個連接組成的池。由於Node是單線程的,因此只能有一個調用(func1或func2可以隨時處理(第二個調用等待到第一個完成),因此只有池中的五個連接中的一個被使用過Nodejs MongoDB連接池如何工作?

使用Nodejs集羣,如果我們fork多個實例,每個實例打開它自己的連接池(每個實例有5個連接)。

問題是 - MongoDB連接池如何在Node環境中工作。我們如何測試這個來演示同時使用同一池中的多個連接?

mongoClient.connect('mongodb://localhost', function(err, db){ 
    app.get('/func1', function(req, res){ 
    for (var i=0; i<100000; i++){ 
     db.collection('test').insert({a:i}); 
    } 
    res.end(); 
    }); 

    app.get('/func2', function(req, res){ 
    for (var i=0; i<100000; i++){ 
     db.collection('test').insert({a:i}); 
    } 
    res.end(); 
    }); 
}); 

回答

0

insert是異步的,所以/func1/func2處理程序都只是排隊100000個插入,然後返回。連接池然後在後臺運行,以便一次執行不超過5次的插入操作(池中每個連接1個)。

+0

所以池只能在mongo內部使用,並且不能用於主節點應用程序代碼(因爲節點是單線程的)? – Raj

+0

@Raj不,連接池存在於節點應用程序代碼中,使用多個網絡連接到MongoDB服務器以並行方式異步執行查詢,同時仍然只使用單個線程。 – JohnnyHK

+0

謝謝。 mongodb中是否有任何統計數據告訴我們池中使用的最大連接數?看看我們是否接近允許的最大值,並在需要時將其撞上。 – Raj