2013-04-30 20 views
5

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); 
       } 

     }); 
    }); 
+0

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

Trả lời

5

Bạn không cần phải làm bất cứ điều gì để kết nối lại như người lái xe sẽ cố gắng kết nối lại vào thất bại. Trong khi nó chờ kết nối lại xảy ra nó sẽ đệm tất cả các hoạt động xảy ra ở giữa và phát lại chúng sau khi kết nối được lên. Nếu bạn muốn tự mình kiểm soát, bạn có thể nghe sự kiện "đóng" trên cá thể db và xử lý kết nối lại theo cách thủ công. Khi kết nối lại đối tượng db sẽ vẫn tồn tại khi một db thực sự chỉ là một trình bao bọc xung quanh nhóm kết nối được chia sẻ và không chứa logic kết nối riêng biệt của nó.

8

According to một đóng góp lớn cho nguồn tài xế, Tốt nhất là để kết nối với cơ sở dữ liệu lúc khởi động và tiếp tục sử dụng lại cùng một kết nối đó cho mỗi yêu cầu.

Trình điều khiển gốc mongodb có một hồ bơi kết nối mà nó duy trì nội bộ và hiện mặc định tối đa 5 kết nối mở. Bạn có thể định cấu hình số lượng kết nối tối đa qua tùy chọn maxPoolSize. Bạn cũng có thể định cấu hình kết nối để tự động kết nối lại với tùy chọn auto_reconnect.

Xem tài liệu here

Các vấn đề liên quan