當200個或更多用戶同時訪問時,我的NodeJS應用程序掛在MongoDB的「查找」查詢上。NodeJS服務器掛起查找同時請求的MongoDB查詢
爲了演示/重現我已經構建的以下小POC,它具有一條路由並連接到MongoDB並獲取數據。當我使用LoadUIweb創建約500個同時請求時,有時,收集的「findone」函數永遠不會返回。
var express = require('express');
var mongodb = require('mongodb');
var config = require('../Config/Config');
var logger = require('../Config/LogManager');
var app = express();
var MONGODB_URI = config.PCMMongoDB;
var db;
var coll;
// Initialize connection once
mongodb.MongoClient.connect(MONGODB_URI, function(err, database) {
if(err) throw err;
db = database;
coll = db.collection('FacilitySettings');
app.listen(3000);
console.log('Listening on port 3000');
});
// Reuse database/collection object
app.get('/', function(req, res) {
logger.loggerinfo.info("Got the request");
//var result = new Array();
coll.find({}, function(err, docs) {
logger.loggerinfo.info("Got the Response", err);
docs.each(function(err, doc) {
if(err){
logger.loggerinfo.info("Got the error while iterating", err);
res.end();
}
if(doc) {
logger.loggerinfo.info("Iterated the Response");
res.write(JSON.stringify(doc) + "\n");
//result.push(doc);
}
else {
logger.loggerinfo.info("Returned the Response");
res.end();
}
});
});
});
「FacilitySettings」集合有大約100個文檔。
當服務器掛起時,它會打印「獲取請求」和「得到響應」,但它從不打印「迭代響應」和「返回響應」。看起來Nodes服務器本身並沒有被掛起,因爲它接受了新的請求。看來MongoDB的結果永遠不會返回。 當我檢查MongoDB上最後執行的查詢時,似乎查詢永遠不會到達MongoDB。 我使用以下版本:
的MongoDB:3.2.3,
節點:5.2.0,
MongoDB的驅動程序:2.1.7
有任何人遇到過這個問題?有什麼工具可用於MongoDB或Nodes來追蹤原因?誰是這裏的罪魁禍首?它是MongoDB還是Node的MongoDB本地驅動程序?
當他們完成時,您沒有關閉打開的連接,因此您在db中引入了內存泄漏。當查找完成時(使用回調或承諾 - 它是異步的 - 使用'conn.close()' –
@ sterling-archer:我印象中當你使用連接池(重新使用數據庫對象)時應該只在應用程序結束時關閉連接,是不是正確或我在這裏丟失了什麼? – Amey
@Amey這是正確的。我看不到任何與您的代碼有關的問題,除非您不檢查您的「err」回調,可能有一個你忽略的錯誤 – JohnnyHK