Saya menggunakan driver simpul-mongodb-asli dengan MongoDB untuk menulis situs web.
Saya memiliki beberapa pertanyaan tentang cara mengelola koneksi:
Apakah cukup menggunakan hanya satu koneksi MongoDB untuk semua permintaan? Apakah ada masalah kinerja? Jika tidak, dapatkah saya mengatur koneksi global untuk digunakan di seluruh aplikasi?
Jika tidak, apakah baik jika saya membuka koneksi baru ketika permintaan datang, dan menutupnya ketika menangani permintaan? Apakah mahal untuk membuka dan menutup koneksi?
Haruskah saya menggunakan kumpulan koneksi global? Saya mendengar pengemudi memiliki kolam koneksi asli. Apakah ini pilihan yang bagus?
Jika saya menggunakan kumpulan koneksi, berapa banyak koneksi yang harus digunakan?
Apakah ada hal lain yang harus saya perhatikan?
Jawaban:
Committer utama ke node-mongodb-native mengatakan :
Jadi, untuk menjawab pertanyaan Anda secara langsung, gunakan kembali objek db yang dihasilkan
MongoClient.connect()
. Ini memberi Anda penggabungan, dan akan memberikan peningkatan kecepatan yang nyata dibandingkan dengan koneksi pembukaan / penutupan pada setiap aksi db.sumber
req.db
dalam middleware ini: github.com/floatdrop/express-mongo-dbBuka koneksi baru ketika aplikasi Node.js dimulai, dan gunakan kembali
db
objek koneksi yang ada :/server.js
/api/users.js
Sumber: Cara Membuka Koneksi Database di Aplikasi Node.js / Express
sumber
Berikut adalah beberapa kode yang akan mengatur koneksi MongoDB Anda.
Saat Anda memulai server, hubungi
initPool
Kemudian di modul lain Anda dapat melakukan hal berikut:
Ini didasarkan pada dokumentasi MongoDB . Lihatlah itu.
sumber
Kelola kumpulan koneksi mongo dalam satu modul mandiri. Pendekatan ini memberikan dua manfaat. Pertama, kode Anda tetap modular dan lebih mudah untuk diuji. Kedua Anda tidak dipaksa untuk mencampur koneksi database Anda di objek permintaan Anda yang BUKAN tempat untuk objek koneksi database. (Mengingat sifat JavaScript, saya akan menganggap sangat berbahaya untuk mencampurkan sesuatu ke objek yang dibangun oleh kode perpustakaan). Maka dengan itu Anda hanya perlu Mempertimbangkan modul yang mengekspor dua metode.
connect = () => Promise
danget = () => dbConnectionObject
.Dengan modul seperti itu, Anda dapat terhubung ke database terlebih dahulu
Saat dalam penerbangan, aplikasi Anda hanya dapat menelepon
get()
ketika membutuhkan koneksi DB.Jika Anda mengatur modul db Anda dengan cara yang sama seperti yang berikut ini tidak hanya Anda akan memiliki cara untuk memastikan bahwa aplikasi Anda tidak bisa boot kecuali Anda memiliki koneksi database Anda juga memiliki cara global untuk mengakses kumpulan koneksi database Anda yang akan kesalahan jika Anda belum mendapat koneksi.
sumber
get()
kita mendapatkan koneksi pool bukan koneksi tunggal. Kumpulan koneksi, sesuai namanya adalah kumpulan logis dari koneksi basis data. Jika tidak ada koneksi di kolam pengemudi akan mencoba untuk membukanya. Setelah koneksi terbuka, digunakan dan kembali ke kolam. Lain kali pool diakses koneksi ini mungkin digunakan kembali. Yang menyenangkan di sini adalah pool akan mengatur koneksi kita untuk kita, jadi jika koneksi terputus kita mungkin tidak akan pernah tahu karena pool akan membuka yang baru untuk kita.Jika Anda memiliki Express.js, Anda dapat menggunakan express-mongo-db untuk melakukan caching dan berbagi koneksi MongoDB antara permintaan tanpa kumpulan (karena jawaban yang diterima mengatakan itu adalah cara yang tepat untuk berbagi koneksi).
Jika tidak - Anda dapat melihat kode sumbernya dan menggunakannya dalam kerangka kerja lain.
sumber
Saya telah menggunakan kolam generik dengan koneksi redis di aplikasi saya - saya sangat merekomendasikannya. Itu generik dan saya pasti tahu itu bekerja dengan mysql jadi saya tidak berpikir Anda akan memiliki masalah dengan itu dan mongo
https://github.com/coopernurse/node-pool
sumber
Anda harus membuat koneksi sebagai layanan kemudian menggunakannya kembali ketika dibutuhkan.
sampel App.js saya
dan gunakan di mana pun Anda inginkan
sumber
http://mongoosejs.com/docs/api.html
Lihatlah sumber luwak. Mereka membuka koneksi dan mengikatnya ke objek Model sehingga ketika Obyek model diperlukan, koneksi dibuat ke DB. Sopir menangani pooling koneksi.
sumber
mongodb
konektor asli .Saya telah menerapkan kode di bawah ini dalam proyek saya untuk menerapkan pengumpulan koneksi dalam kode saya sehingga akan membuat koneksi minimum dalam proyek saya dan menggunakan kembali koneksi yang tersedia
sumber
Pendekatan terbaik untuk menerapkan koneksi koneksi adalah Anda harus membuat satu variabel array global yang menyimpan nama db dengan objek koneksi yang dikembalikan oleh MongoClient dan kemudian menggunakan kembali koneksi itu setiap kali Anda perlu menghubungi Database.
Di Server.js Anda tentukan var global.dbconnections = [];
Buat Layanan penamaan connectionService.js. Ini akan memiliki 2 metode getConnection dan createConnection. Jadi ketika pengguna akan memanggil getConnection (), ia akan menemukan detail dalam variabel koneksi global dan mengembalikan detail koneksi jika sudah ada yang lain itu akan memanggil createConnection () dan mengembalikan Detail koneksi.
Panggil layanan ini menggunakan db_name dan itu akan mengembalikan objek koneksi jika sudah ada yang lain itu akan membuat koneksi baru dan mengembalikannya kepada Anda.
Semoga bermanfaat :)
Berikut adalah kode connectionService.js:
sumber
mongodb.com -> proyek baru -> cluster baru -> koleksi baru -> connect -> alamat IP: 0.0.0.0/0 & kredibilitas db -> hubungkan aplikasi Anda -> salin string koneksi dan rekatkan dalam file .env dari node Anda aplikasi dan pastikan untuk mengganti "" dengan kata sandi yang sebenarnya untuk pengguna dan juga mengganti "/ test" dengan nama db Anda
buat file baru .env
sumber
Jika menggunakan express ada metode lain yang lebih mudah, yaitu memanfaatkan fitur bawaan Express untuk berbagi data antara rute dan modul dalam aplikasi Anda. Ada objek bernama app.locals. Kami dapat melampirkan properti padanya dan mengaksesnya dari dalam rute kami. Untuk menggunakannya, instantiate koneksi mongo Anda di file app.js Anda.
Koneksi basis data ini, atau memang data lain yang ingin Anda bagikan di sekitar modul aplikasi Anda kini dapat diakses dalam rute Anda dengan
req.app.locals
seperti di bawah ini tanpa perlu membuat dan membutuhkan modul tambahan.Metode ini memastikan bahwa Anda memiliki koneksi database terbuka selama aplikasi Anda kecuali Anda memilih untuk menutupnya kapan saja. Ini mudah diakses dengan
req.app.locals.your-collection
dan tidak memerlukan pembuatan modul tambahan apa pun.sumber