За да уточним – Node.js ене еднонишков. Кодът на приложението ви се изпълнява в една нишка, но под капака той ги използва, когато е необходимо - вижте тук (както отговорът, така и коментарите под него):
И:
Както можете да видите mysql
модулът, който използвате, изисква да предадете обратно извикване за query()
метод (и вероятно за много други). Така че, когато го извикате, изпълнението на вашия код продължава и обратното извикване се извиква, когато пристигнат резултатите от базата данни.
Що се отнася до въпроса ви - не създавате нова връзка за всяка заявка. Разгледайте readme файл на mysql
модул, Обединяващи връзки раздел
:
Когато извикате dbPool.getConnection()
връзката се създава само ако няма повече налични връзки в пула - в противен случай тя просто грабва една от горната част на нея. Извикване на objConn.release()
освобождава връзката обратно към пула - тя не се прекъсва. Това извикване позволява повторното му използване от други части на вашето приложение.
За да обобщим:
- Създаването на нова връзка за всяка заявка не е добра идея тъй като ще използва повече ресурси (CPU, RAM) както на машините на вашето приложение, така и на базата данни.
- Използването на една връзка за всички заявки също е погрешно, защото ако някоя от операциите отнеме много време за завършване, връзката ви ще увисне и всички други заявки ще изчакат.
- Използване на пул за връзки е страхотна идея, която ви позволява да извършвате няколко операции върху вашата база данни едновременно, дори ако една от тях отнема много време за завършване.
Актуализация: За да отговорите на въпросите от коментарите:
Когато използвате една връзка за всяка заявка, mysql
модулът трябва да отвори нов сокет, да се свърже с базата данни и да се удостовери, преди да направите своята заявка - това отнема време и изяжда някои ресурси. Поради това това е лош подход.
От друга страна, когато използвате само една връзка (не пул за връзки), изпълнението на заявка, която отнема много време за завършване, ще блокира всички други заявки за тази връзка, докато завърши - което означава, че всяка друга заявка ще трябва да изчака. Това също е лош подход.
Създаването на нов пул за връзки за всяка заявка е почти като използването на нова връзка, освен ако не извикате pool.getConnection()
няколко пъти - тогава е още по-лошо (вземете използваните ресурси, като създадете нова връзка и го умножете по броя на pool.getConnection()
обаждания).
За допълнително изясняване на една връзка за всяка операция срещу всички операции в една връзка въпрос:
Всяка операция във всяка връзка се стартира след завършване на предишната (синхронна е, но не от страна на клиента), така че ако имате таблица с няколко милиарда реда и издавате SELECT * FROM yourtable
ще отнеме известно време, за да завърши, блокирайки всяка операция на тази връзка, докато приключи.
Ако имате една връзка за всяка операция, която трябва да се издава паралелно (напр. за всяка заявка), проблемът изчезва. Но както беше посочено по-рано, отварянето на нова връзка изисква време и ресурси, поради което пулът за връзки концепцията беше въведена.
Така че отговорът е:използвайте един пул за връзки за всички заявки (както правите в примерния си код) – броят на връзките ще се мащабира в съответствие с трафика във вашето приложение.
Актуализация №2:
Въз основа на коментарите виждам, че трябва да обясня и концепцията зад пуловете за връзки. Как работи е, че стартирате приложение с празен пул за връзки и инициализиран, за да създадете максимум n връзки (afaik това е 10 за mysql
модул по подразбиране).
Всеки път, когато извикате dbPool.getConnection()
той проверява дали има налични връзки в пула. Ако има, грабва един (прави го недостъпен), ако не, създава нов. Ако се достигне ограничението за връзка и няма налични връзки, се повдига някакъв вид изключение.
Извикване на connection.release()
освобождава връзката обратно към пула, така че да е налична отново.
Използването на пул за получаване само на една глобална връзка за цяло приложение е напълно погрешно и противоречи на самата концепция (можете да направите същото, като просто създадете връзката ръчно), така че като използвате пул за връзки Имам предвид използвайте пул за връзки, както е трябвало да се използва - за да получавате връзки от него, когато имате нужда от тях .