2012-04-18 31 views
6

Tôi đang cố gắng sử dụng MongoJS làm trình bao bọc cho trình điều khiển Mongo gốc trong Nút. Tôi đang lập mô hình các tài liệu trong bộ sưu tập của mình dưới dạng các lớp JavaScript với các phương thức như populate(), save(), v.v.Cách thích hợp để quản lý các kết nối đến Mongo với MongoJS là gì?

Trong hầu hết các ngôn ngữ như C# và Java, tôi được sử dụng để kết nối rõ ràng và sau đó ngắt kết nối cho mọi truy vấn. Hầu hết các ví dụ chỉ đưa ra một ví dụ về kết nối, nhưng không bao giờ đóng kết nối khi hoàn thành. Tôi không chắc chắn nếu người lái xe có thể tự mình quản lý hoặc nếu tôi cần tự làm như vậy. Tài liệu thưa thớt.

Dưới đây là các mã có liên quan:

User.prototype.populate = function(callback) { 
    var that = this;  

    this.db = mongo.connect("DuxDB"); 
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){ 
     if(!err && doc) { 
      that.firstName = doc.firstName; 
      that.lastName = doc.lastName; 
      that.password = doc.password; 
     } 

     if (typeof(callback) === "function"){ 
      callback.call(that); 
     } 

     that.db.close(); 
    }); 
}; 

Tôi thấy rằng ngay sau khi tôi gọi phương thức close() trên đối tượng MongoJS, tôi không còn có thể mở một kết nối mới cho các cuộc gọi tiếp theo. Tuy nhiên, nếu tôi không gọi phương thức này, quá trình Node sẽ không bao giờ chấm dứt khi tất cả các cuộc gọi async kết thúc, như thể nó đang chờ ngắt kết nối từ Mongo.

Cách thích hợp để quản lý kết nối với Mongo bằng MongoJS là gì?

Trả lời

7

Bạn sẽ nhận được hiệu suất tốt hơn từ ứng dụng của mình nếu bạn để (các) kết nối mở, thay vì ngắt kết nối. Tạo kết nối TCP, và, trong trường hợp MongoDB, phát hiện cấu hình thiết lập/sao chép khi thích hợp, tương đối đắt so với thời gian thực sự xử lý truy vấn và cập nhật. Tốt hơn là "dành" thời gian này một lần và duy trì kết nối mở thay vì liên tục thực hiện lại công việc này.

+2

Làm cho tinh thần. Có một thời điểm thích hợp để đóng kết nối khi tôi không còn cần đối tượng (một loại một số loại destructor)? Hay điều này được đưa vào tài khoản bởi trình điều khiển khi JavaScript rác thu thập tham chiếu đến đối tượng MongoJS? Không gọi close() không bao giờ cho phép quá trình Node kết thúc trong bảng điều khiển khi tất cả các cuộc gọi kết thúc. – DuxPrime

5

Không mở + đóng kết nối cho mọi truy vấn. Mở kết nối một lần và sử dụng lại nó.

2

làm cái gì đó nhiều như thế này tái sử dụng kết nối db của bạn cho tất cả gọi

User = function(db) { 
    this.db = db; 
} 


User.prototype.populate = function(callback) { 
    var that = this; 
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){ 
     if(!err && doc) { 
      that.firstName = doc.firstName; 
      that.lastName = doc.lastName; 
      that.password = doc.password; 
     } 

     if (typeof(callback) === "function"){ 
      callback.call(that); 
     } 
    }); 
}; 
0

Tôi tin rằng nó thực sự đóng kết nối sau mỗi lần yêu cầu, nhưng nó đặt {auto_reconnect: true} trong cấu hình máy chủ MongoDB, vì vậy nó sẽ mở lại một kết nối mới bất cứ khi nào cần thiết.

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