Para esclarecer - Node.js não de rosca única. O código do seu aplicativo é executado em um thread, mas nos bastidores ele os usa quando necessário - dê uma olhada aqui (tanto a resposta quanto os comentários abaixo):
E:
Como você pode ver o
mysql
módulo que você usa requer que você passe um retorno de chamada para o query()
método (e provavelmente para muitos mais). Então, quando você o chama, a execução do seu código continua e o callback é chamado quando os resultados do banco de dados chegam. Quanto à sua pergunta - você não está criando uma nova conexão para cada solicitação. Dê uma olhada no readme arquivo do
mysql
módulo, o Conexões de pool seção
:Quando você chama
dbPool.getConnection()
a conexão é criada apenas se não houver mais conexões disponíveis no pool - caso contrário, ele apenas pega uma do topo. Chamando objConn.release()
libera a conexão de volta ao pool - não está sendo desconectado. Essa chamada permite que ela seja reutilizada por outras partes do seu aplicativo. Resumindo:
- Criar uma nova conexão para cada solicitação não é uma boa ideia pois ele usará mais recursos (CPU, RAM) nas máquinas do seu aplicativo e do banco de dados.
- Usar uma conexão para todas as solicitações também é errado porque, se alguma das operações demorar muito para ser concluída, sua conexão será interrompida, fazendo com que todas as outras solicitações aguardem.
- Usando um pool de conexões é uma ótima ideia que permite realizar várias operações em seu banco de dados ao mesmo tempo, mesmo que uma delas demore muito para ser concluída.
Atualização: Para responder às perguntas dos comentários:
Quando você está usando uma conexão para cada solicitação, o
mysql
O módulo precisa abrir um novo soquete, conectar-se ao banco de dados e autenticar antes de fazer sua consulta - isso leva tempo e consome alguns recursos. Por isso é uma abordagem ruim. Por outro lado, ao usar apenas uma conexão (não pool de conexões), a execução de uma consulta que leva muito tempo para ser concluída bloqueará quaisquer outras consultas nessa conexão até que ela seja concluída - o que significa que qualquer outra solicitação terá que esperar. Também é uma abordagem ruim.
Criar um novo pool de conexões para cada solicitação é como usar uma nova conexão, a menos que você chame
pool.getConnection()
várias vezes - então é ainda pior (pegue os recursos usados criando uma nova conexão e multiplique pelo número de pool.getConnection()
chamadas). Para esclarecer melhor a uma conexão para cada operação vs todas as operações em uma conexão pergunta:
Cada operação em cada conexão é iniciada após a conclusão da anterior (é síncrona, mas não no lado do cliente), portanto, se você tiver uma tabela com alguns bilhões de linhas e emitir
SELECT * FROM yourtable
levará algum tempo para ser concluído, bloqueando todas as operações nesta conexão até que seja concluída. Se você tiver uma conexão para cada operação que precisa ser emitida em paralelo (por exemplo, para cada solicitação), o problema desaparece. Mas, como dito anteriormente, abrir uma nova conexão requer tempo e recursos, e é por isso que o conjunto de conexões conceito foi introduzido.
Portanto, a resposta é:use um pool de conexões para todas as solicitações (como você faz no seu código de exemplo) - o número de conexões será dimensionado de acordo com o tráfego em seu aplicativo.
Atualização nº 2:
Com base nos comentários, vejo que também devo explicar o conceito por trás dos pools de conexão. Como funciona é que você inicia um aplicativo com um pool de conexões vazio e inicializado para criar um máximo de n conexões (afaik é 10 para
mysql
módulo por padrão). Sempre que você chamar
dbPool.getConnection()
ele verifica se há conexões disponíveis no pool. Se houver, ele pega um (torna-o indisponível), se não, ele cria um novo. Se o limite de conexão for atingido e não houver conexões disponíveis, algum tipo de exceção é gerado. Chamando
connection.release()
libera a conexão de volta ao pool para que fique disponível novamente. Usar um pool para obter apenas uma conexão global para um aplicativo inteiro é totalmente errado e contra o próprio conceito (você pode fazer a mesma coisa apenas criando a conexão manualmente), então use um pool de conexões Quero dizer, use um pool de conexões como deveria ser usado - para obter conexões dele quando precisar delas .