Untuk memperjelas - Node.js tidak berulir tunggal. Kode aplikasi Anda dieksekusi dalam satu utas, tetapi di balik kap mesin itu menggunakannya saat dibutuhkan - lihat di sini (baik jawaban dan komentar di bawahnya):
Dan:
Seperti yang Anda lihat mysql
modul yang Anda gunakan mengharuskan Anda untuk meneruskan panggilan balik untuk query()
metode (dan mungkin untuk lebih banyak lagi). Jadi saat Anda memanggilnya, eksekusi kode Anda berlanjut dan panggilan balik dipanggil saat hasil dari database tiba.
Adapun pertanyaan Anda - Anda tidak membuat koneksi baru untuk setiap permintaan. Lihat readme file mysql
modul, Koneksi Pengumpulan bagian
:
Saat Anda memanggil dbPool.getConnection()
koneksi dibuat hanya jika tidak ada lagi koneksi yang tersedia di kumpulan - jika tidak, koneksi hanya mengambil satu dari atasnya. Memanggil objConn.release()
melepaskan koneksi kembali ke kolam - itu tidak terputus. Panggilan ini memungkinkannya untuk digunakan kembali oleh bagian lain dari aplikasi Anda.
Singkatnya:
- Membuat koneksi baru untuk setiap permintaan bukanlah ide yang baik karena akan menggunakan lebih banyak sumber daya (CPU, RAM) di mesin aplikasi dan database Anda.
- Menggunakan satu koneksi untuk semua permintaan juga salah karena jika ada operasi yang membutuhkan waktu lama untuk menyelesaikannya, koneksi Anda akan hang membuat semua permintaan lain menunggunya.
- Menggunakan kumpulan koneksi adalah ide bagus yang memungkinkan Anda melakukan beberapa operasi pada database secara bersamaan, meskipun salah satunya membutuhkan waktu lama untuk diselesaikan.
Pembaruan: Untuk menjawab pertanyaan dari komentar:
Saat Anda menggunakan satu koneksi untuk setiap permintaan, mysql
modul harus membuka soket baru, terhubung ke database dan mengautentikasi sebelum Anda membuat kueri - ini membutuhkan waktu dan memakan beberapa sumber daya. Karena itu pendekatan yang buruk.
Di sisi lain, saat hanya menggunakan satu koneksi (bukan kumpulan koneksi), menjalankan kueri yang membutuhkan waktu lama untuk diselesaikan akan memblokir kueri lain apa pun pada koneksi itu hingga selesai - yang berarti bahwa permintaan lain harus menunggu. Ini juga pendekatan yang buruk.
Membuat kumpulan koneksi baru untuk setiap permintaan hampir sama seperti menggunakan koneksi baru, kecuali jika Anda memanggil pool.getConnection()
beberapa kali - bahkan lebih buruk (ambil sumber daya yang digunakan dengan membuat koneksi baru dan kalikan dengan jumlah pool.getConnection()
panggilan).
Untuk lebih memperjelas satu koneksi untuk setiap operasi vs semua operasi dalam satu koneksi pertanyaan:
Setiap operasi di setiap koneksi dimulai setelah yang sebelumnya selesai (sinkron, tetapi tidak di sisi klien), jadi jika Anda memiliki tabel dengan beberapa miliar baris dan keluarkan SELECT * FROM yourtable
perlu beberapa waktu untuk menyelesaikannya, memblokir setiap operasi pada koneksi ini hingga selesai.
Jika Anda memiliki satu koneksi untuk setiap operasi yang perlu dikeluarkan secara paralel (misalnya untuk setiap permintaan), masalahnya akan hilang. Tetapi seperti yang dinyatakan sebelumnya, membuka koneksi baru membutuhkan waktu dan sumber daya, itulah sebabnya kumpulan koneksi konsep diperkenalkan.
Jadi jawabannya adalah:gunakan satu kumpulan koneksi untuk semua permintaan (seperti yang Anda lakukan dalam kode contoh) - jumlah koneksi akan disesuaikan dengan lalu lintas di aplikasi Anda.
Pembaruan #2:
Berdasarkan komentar saya melihat bahwa saya juga harus menjelaskan konsep di balik kumpulan koneksi. Cara kerjanya adalah Anda memulai aplikasi dengan kumpulan koneksi kosong dan diinisialisasi untuk membuat maksimum n koneksi (afaik 10 untuk mysql
modul secara default).
Kapan pun Anda memanggil dbPool.getConnection()
itu memeriksa apakah ada koneksi yang tersedia di kolam. Jika ada itu ambil satu (membuatnya tidak tersedia), jika tidak itu membuat yang baru. Jika batas koneksi tercapai dan tidak ada koneksi yang tersedia, beberapa jenis pengecualian akan muncul.
Memanggil connection.release()
melepaskan koneksi kembali ke kumpulan sehingga tersedia lagi.
Menggunakan kumpulan untuk mendapatkan hanya satu koneksi global untuk seluruh aplikasi benar-benar salah dan bertentangan dengan konsep itu sendiri (Anda dapat melakukan hal yang sama hanya dengan membuat koneksi secara manual), jadi dengan gunakan kumpulan koneksi Maksud saya gunakan kumpulan koneksi seperti yang seharusnya digunakan - untuk mendapatkan koneksi darinya saat Anda membutuhkannya .