Làm việc với Nodejs và MongoDB thông qua trình điều khiển gốc Node MongoDB. Cần truy xuất một số tài liệu và sửa đổi, sau đó lưu chúng lại ngay. Đây là một ví dụ:Khi nào đóng kết nối cơ sở dữ liệu MongoDB trong Nodejs
db.open(function (err, db) {
db.collection('foo', function (err, collection) {
var cursor = collection.find({});
cursor.each(function (err, doc) {
if (doc != null) {
doc.newkey = 'foo'; // Make some changes
db.save(doc); // Update the document
} else {
db.close(); // Closing the connection
}
});
});
});
Với tính chất không đồng bộ, nếu quá trình cập nhật tài liệu mất nhiều thời gian hơn, thì kết nối cơ sở dữ liệu sẽ bị đóng. Không phải tất cả các bản cập nhật đều được lưu vào cơ sở dữ liệu.
Nếu bỏ qua db.close()
, tất cả tài liệu được cập nhật chính xác nhưng ứng dụng bị treo, không bao giờ thoát.
Tôi thấy một bài đăng đề xuất sử dụng bộ đếm để theo dõi số lượng cập nhật, khi giảm về 0, sau đó đóng db. Nhưng tôi có làm gì sai ở đây không? Cách tốt nhất để xử lý loại tình huống này là gì? Có phải db.close()
phải được sử dụng để giải phóng tài nguyên không? Hay một kết nối db mới cần mở?
@realguess, cũng có libs cho utils đồng thời có thể giúp bạn thực hiện công cụ này để bạn không phải quản lý chi tiết. hãy xem async.js, ví dụ: https://github.com/caolan/async – mpobrien
@mpobrien, bạn có thể giải thích cách sử dụng async để giải quyết vấn đề này không? –
Bạn có nghĩ rằng các giải pháp này vẫn giữ trong năm 2017 hoặc bạn có biết điều gì tốt hơn không? Tôi đã suy nghĩ về một cái gì đó như thế này, nhưng nếu hàm trong 'cursor.each (function (err, doc) {' gọi một hàm async, do đó sẽ thực thi logic trong một cuộc gọi lại và có khả năng cần cơ sở dữ liệu sau 'each() Và nếu sau những thay đổi tiếp theo trong phần mềm, hàm callback đó gọi một hàm async khác (tôi hy vọng bạn có được ý tưởng) – watery