Para aclarar:Node.js no de un solo hilo. El código de su aplicación se ejecuta en un hilo, pero en el fondo los usa cuando es necesario. Eche un vistazo aquí (tanto la respuesta como los comentarios debajo):
Y:
Como puede ver el mysql
El módulo que usa requiere que pase una devolución de llamada para query()
método (y probablemente para muchos más). Entonces, cuando lo llama, la ejecución de su código continúa y la devolución de llamada se llama cuando llegan los resultados de la base de datos.
En cuanto a su pregunta, no está creando una nueva conexión para cada solicitud. Eche un vistazo al léame archivo del mysql
módulo, Conexiones de agrupación sección
:
Cuando llamas a dbPool.getConnection()
la conexión se crea solo si no hay más conexiones disponibles en el grupo; de lo contrario, solo toma una de la parte superior. Llamando a objConn.release()
libera la conexión de nuevo al grupo; no se desconecta. Esta llamada permite que otras partes de su aplicación la reutilicen.
En resumen:
- Crear una nueva conexión para cada solicitud no es una buena idea ya que utilizará más recursos (CPU, RAM) tanto en las máquinas de su aplicación como en las de la base de datos.
- Usar una conexión para todas las solicitudes también es incorrecto porque si alguna de las operaciones tarda mucho tiempo en completarse, su conexión se bloqueará y todas las demás solicitudes esperarán por ella.
- Uso de un grupo de conexiones es una gran idea que le permite realizar varias operaciones en su base de datos al mismo tiempo, incluso si una de ellas tarda mucho tiempo en completarse.
Actualización: Para responder a las preguntas de los comentarios:
Cuando está utilizando una conexión para cada solicitud, mysql
el módulo tiene que abrir un nuevo socket, conectarse a la base de datos y autenticarse antes de realizar su consulta; esto lleva tiempo y consume algunos recursos. Por eso es un mal enfoque.
Por otro lado, cuando se usa solo una conexión (no grupo de conexiones), ejecutar una consulta que tarda mucho tiempo en completarse bloqueará cualquier otra consulta en esa conexión hasta que se complete, lo que significa que cualquier otra solicitud tendrá que esperar. También es un mal enfoque.
Crear un nuevo grupo de conexiones para cada solicitud es muy parecido a usar una nueva conexión, a menos que llame a pool.getConnection()
varias veces, entonces es aún peor (tome los recursos utilizados al crear una nueva conexión y multiplíquelos por el número de pool.getConnection()
llamadas).
Para aclarar aún más la una conexión para cada operación vs todas las operaciones en una conexión pregunta:
Cada operación en cada conexión se inicia después de que se completa la anterior (es sincrónica, pero no en el lado del cliente), por lo que si tiene una tabla con unos miles de millones de filas y emite SELECT * FROM yourtable
llevará algún tiempo completarlo, bloqueando todas las operaciones en esta conexión hasta que finalice.
Si tiene una conexión para cada operación que debe ejecutarse en paralelo (por ejemplo, para cada solicitud), el problema desaparece. Pero como se indicó anteriormente, abrir una nueva conexión requiere tiempo y recursos, por lo que el grupo de conexiones se introdujo el concepto.
Entonces, la respuesta es:usar un grupo de conexiones para todas las solicitudes (como lo hace en su código de ejemplo):la cantidad de conexiones se escalará de acuerdo con el tráfico en su aplicación.
Actualización n.º 2:
Según los comentarios, veo que también debería explicar el concepto detrás de los grupos de conexiones. La forma en que funciona es que inicia una aplicación con un grupo de conexiones vacío e inicializado para crear un máximo de n conexiones (afaik es 10 para mysql
módulo por defecto).
Siempre que llame a dbPool.getConnection()
comprueba si hay conexiones disponibles en el grupo. Si hay, toma uno (lo hace no disponible), si no, crea uno nuevo. Si se alcanza el límite de conexiones y no hay conexiones disponibles, se genera algún tipo de excepción.
Llamando a connection.release()
libera la conexión al grupo para que esté disponible nuevamente.
Usar un grupo para obtener solo una conexión global para una aplicación completa es totalmente incorrecto y va en contra del concepto en sí mismo (puede hacer lo mismo simplemente creando la conexión manualmente), así que use un grupo de conexiones Me refiero a usar un grupo de conexiones como se suponía que debía usarse, para obtener conexiones de él cuando las necesite .