2013-09-06 41 views
45

Trong rất nhiều ví dụ giới thiệu của việc sử dụng MongoDB, bạn sẽ thấy mã như thế này:Giữ mở một kết nối cơ sở dữ liệu MongoDB

var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect("mongodb://localhost:port/adatabase", function(err, db) 
{ 
    /* Some operation... CRUD, etc. */ 
    db.close(); 
}); 

Nếu MongoDB cũng giống như bất kỳ hệ thống cơ sở dữ liệu khác, openclose hoạt động thường đắt tiền thời gian khôn ngoan . Vì vậy, câu hỏi của tôi là: Chỉ cần làm MongoClient.connect("... một lần, gán giá trị trả lại db cho một số mô-đun toàn cầu, có các chức năng khác nhau trong mô-đun thực hiện nhiều công việc liên quan đến cơ sở dữ liệu (chèn tài liệu vào bộ sưu tập, cập nhật tài liệu, vv ..) khi chúng được gọi bởi các phần khác của ứng dụng (và do đó tái sử dụng giá trị db), và sau đó, khi ứng dụng được thực hiện, chỉ sau đó thực hiện close.

Nói cách khác, openclose được thực hiện một lần - không phải mỗi lần bạn cần thực hiện và thực hiện một số thao tác liên quan đến cơ sở dữ liệu. Và bạn tiếp tục sử dụng lại đối tượng db được trả lại trong lần đầu tiên open\connect, chỉ để vứt bỏ nó ở cuối, với close, khi bạn thực sự được thực hiện với tất cả công việc liên quan đến cơ sở dữ liệu của mình.

Rõ ràng, vì tất cả I/O là đồng bộ, trước close, bạn phải đảm bảo rằng hoạt động cơ sở dữ liệu cuối cùng đã hoàn tất trước khi phát hành close. Có vẻ như điều này nên được OK, nhưng tôi muốn kiểm tra lại chỉ trong trường hợp tôi đang thiếu một cái gì đó như tôi mới đến MongoDB. Cảm ơn!

+0

Đồng thời kiểm tra [this] (http://stackoverflow.com/questions/14495975/why-its-recommended-not-to-close-any-mongodb-connection-anywhere-in-node-js-code), có thể giúp bạn –

+0

Thú vị .... Có, hữu ích; Cảm ơn nhiều! – Lew

Trả lời

35

Vâng, đó là hành vi tốt và điển hình. khởi động ứng dụng của bạn, kết nối với db, thực hiện các hoạt động chống lại db trong một thời gian dài, có thể kết nối lại nếu kết nối chết bất ngờ, và sau đó không bao giờ đóng kết nối (chỉ dựa vào đóng tự động xảy ra khi quá trình của bạn chết) .

+1

Ngoài ra, bạn nhận được 5 kết nối được gộp theo mặc định với nút-mongodb-native. Xem các tài liệu trên [poolSize] (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connect-options). – hurrymaplelad

+0

Cảm ơn rất nhiều vì đã xác nhận những nghi ngờ của tôi, Peter - hãy đánh giá cao điều đó! – Lew

+0

Tôi đã làm theo giải pháp https://stackoverflow.com/a/24634454/3994271 thực hiện điều tương tự như đã đề cập trong câu trả lời này. Tuy nhiên, làm thế nào chúng ta có thể tự động kết nối lại nếu kết nối bao giờ chết bất ngờ? – Ayan

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