Có thực tiễn tốt trong các nút để mở kết nối mongodb cho mỗi yêu cầu và đóng nó trong cuộc gọi lại không?mongodb nodejs trình điều khiển gốc đóng kết nối hoặc không
app.get('/some_route', function(){
MongoClient.connect(url,function(err, db){
//some db query with callback
db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
//close db connection
db.close();
}else{
//do something with item
res.send(item);
//close db connection
db.close();
}
});
});
Một số người cho rằng mở/đóng kết nối mongodb trên mỗi yêu cầu là không cần thiết, kể từ khi được mở, một nhóm kết nối có thể được chia sẻ.
Câu hỏi đặt ra là cách duy trì và chia sẻ hồ bơi đó? Mongoose có tự động làm điều đó không?
Đặc biệt, trên thời gian chờ hoặc ngắt kết nối mongodb, có cần phải kết nối lại không?
Tôi tìm thấy câu trả lời mâu thuẫn ở đây close mongodb connection per request or not
Hầu như tất cả các tuyến doc nodejs mongodb native driver và mã ví dụ tôi đọc, một db.open() được ghép nối với db.close() ở đâu đó trong callback.
Bởi vì nếu một vũng kết nối được chia sẻ, người ta có thể mã Theo câu trả lời christkv của, một mã sức:
var p_db=null;
var c_opt = {server:{auto_reconnect:true}};
app.get('/some_route', function(){
//pseudo code
if (!p_db){
MongoClient.connect(url, c_opt, function(err,db){
p_db = db;
p_db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
}else{
//do something with item
res.send(item);
}
});
});
}else {
p_db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
}else{
//do something with item
res.send(item);
}
});
});
Tôi đã đọc phần mongoose src vài tháng trước, họ mở một kết nối cho mỗi bộ sưu tập, vì vậy nó chỉ được lưu trong bộ nhớ cache. không chắc chắn họ có thể thay đổi. Tôi viết mô-đun để kết nối và chạy nó trước app.listen. – wayne