[Mongodb] Hỏi về việc disconnect mongodb
-
Theo mình được biết thì các kết nối đến Database sẽ được thiết lập khi có request vào đóng khi xong request đó. Nhưng các dự án mà mình từng tham gia dường như chỉ cần kết nối đến server là tự động mở connection luôn (và không thấy đóng).
Vậy mình muốn hỏi là thằng nodejs (hay mongoose) có cơ chế tự đóng connection à?, hay thiết kế hiện tại không đóng thôi. Và nếu muốn thiết lập mở/đóng conenction thì đặt 2 hàm này ở đâu trong thiết kế.
Mình xin cảm ơn ạ!
-
@Nos-Gnoh
Việc này tùy thuộc bạn config pool. Thường pool db có 2 thông số min and max
Nếu min > 0 thì lúc nào cunxg sẽ có ít nhất min connection keep.Nó có hàm để bạn open new connection mới. Hàm này thì bạn đẻ tùy theo logic dự án của bạn thôi. Cái này về phần db. Nên mình vote để ở model base. Hoặc gateway với DB
-
mongoose thì bạn có thể tham khảo cơ chế autoReconnect và reconnectTries nhé
-
@Nguyen-Hien e thấy hơi khó hình dung tí. Hiện tại em đang thiết kế như này:
Lúc trước cũng thấy nó hơi sida muốn chuyển qua model nhưng k biết chuyển thế nào. Vì đang muốn mở connection ở mỗi request và close luôn sau request đó.
-
@Bảo-Trần-Sỹ cái này hình như là tự động connect lại db ạ?.
Mình đang muốn là mở connection ở mỗi request và close luôn sau request đó. Có hàm nào kiểu đó k nhỉ?
-
Bạn tham khảo trang này thử nhé
https://stackoverflow.com/questions/8813838/properly-close-mongooses-connection-once-youre-done
-
@Bảo-Trần-Sỹ ừm mình cũng đang sử dụng hàm disconnect và mọi thứ diễn ra bình thường rồi, nhưng cái mình muốn hỏi ở đây là đặt phần connect và disconnect db ở đâu cho hợp lý, vì như hình ở trên thì mình thấy thiết kế nó hơi rườm rà. Bạn có tài liệu hay link tham khảo nào về phần này k ạ?
-
@Nos-Gnoh Thường theo mình thấy ko ai cứ để trong chỗ gateway mình query đâu. Bạn nên để trong cái hook default cảu cả hệ thống modle bạn á. Mỗi lần có 1 action nào dó với db thfi init connection . Sau đó thì close. Nó work behind the scene thôi. Chứ như trên bạn viết sẽ rất nhiều chỗ. Rồi nhiều lúc quên. Etc =.=. Lỡ chả may cú pháp thay đổi. Cách tiếp cận mới. Sưa cũng bèo bèo 50 chỗ =))
-
@Nguyen-Hien vâng thì em đang nghĩ vậy nên mới thắc mắc đấy ạ. Nhưng k biết implement cái đó thế nào, a có tài liệu nào về phần này hay có thể chỉ rõ cho e được k ạ. E cảm ơn ạ :))
-
@Nos-Gnoh
Ý tưởng ở đây mình sẽ dùng 1 pool để chưa connection tới MongoDB. Nó sẽ làm nhiệm vụ quản lý dùm mình. Mình chỉ cần thực hiện các lệnh như insert, find, update...
Mình asume là bạn dùng: https://github.com/mongodb/node-mongodb-native
Ý tưởng của mình thì lấy từ bài viết này: https://www.compose.com/articles/connection-pooling-with-mongodb/Code chính
// This is a global variable we'll use for handing the MongoDB client var mongodb; // Connection URL var url = '[connectionString]'; // Create the database connection MongoClient.connect(url, { poolSize: 10 // other options can go here },function(err, db) { assert.equal(null, err); mongodb=db; } ); global.mongodb = mongodb
Ở 1 file khác thì dùng sẽ là
const mongodb = global.mongodb // Use the connect method to connect to the server when the page is requested app.get('/', function(request, response) { mongodb.listCollections({}).toArray(function(err, collections) { assert.equal(null, err); collections.forEach(function(collection) { console.log(collection); }); }) response.send('See console for a list of available collections'); });
-
@Nguyen-Hien okay thank a ạ, để e nghiên cứu thử
-
@Nos-Gnoh Yup. Thử đi bạn. Nói chung nên dùng pool để manage connection. Do tương lại nếu có cluster thì mình luôn kiểm soát đc lượng connect đến DB mà tính toán cluster.
-
@Nos-Gnoh Bạn có thể cho mình xin email mình hỏi bạn chút được không
-
@Khôi-Nguyên sr lâu rồi mình k vào check. Mail mình đây nếu bạn còn cần : [email protected]ail.com
-
Mình vẫn chưa hiểu làm sao wor file 2 lại gọi được thằng global.mongodb vì hàm connect chạy bất đồng bộ mà nhỉ
-
@Đỗ-Hoàng-Tiến việc function chạy thì bạn vẫn đưa vào đc. Cái bạn confuse là sợ nó chưa chạy xong thì client gửi request. Lúc này global.mongodb ko có. Thì bth cái file 1 sẽ đc bọc trong 1 promise initialize function trước khi run app code ở các ngôn ngữ có sp event loop
Kiểu initialize().then(app.runserver)
Trong đó initialize hay dùng để seed data. Sync model và connect tới db.