Seu carrinho está vazio no momento!

Introdução (3 min)
Imagine um restaurante movimentado em horário de pico. Diversos clientes pedem água simultaneamente. Seria ineficiente se o garçom tivesse que ir até o filtro e encher um copo para cada cliente individualmente. A solução? Uma jarra de água! O connection pooling em APIs funciona de forma similar. Ao invés de criar uma nova conexão com o banco de dados para cada requisição, mantemos um “pool” de conexões prontas para serem utilizadas e reutilizadas, otimizando drasticamente o desempenho.
Em APIs modernas, lidar com múltiplas requisições simultâneas é essencial. O connection pooling é primordial para garantir a escalabilidade e a responsividade da sua aplicação. Nesta aula, vamos construir um exemplo prático de connection pooling em Node.js/Express usando o módulo pg, um cliente PostgreSQL.
No ecossistema Node.js/Express, o connection pooling se integra perfeitamente com frameworks como o Express, permitindo a criação de APIs robustas e eficientes. Isso é especialmente importante em ambientes de produção, como o HostGator Plano M, onde a performance é crucial.
Conceito Fundamental (7 min)
Connection pooling é uma técnica que mantém um conjunto de conexões com o banco de dados abertas e prontas para uso. Quando uma requisição chega, a aplicação pega uma conexão do pool, a utiliza e, em seguida, a devolve ao pool. Isso evita o overhead de estabelecer uma nova conexão para cada requisição, o que pode ser um processo demorado.
A terminologia chave inclui: pool, que é o conjunto de conexões; conexão, a ligação individual com o banco; acquire, o processo de obter uma conexão do pool; release, o processo de devolver a conexão ao pool.
Casos de uso comuns em produção incluem aplicações web, APIs RESTful e microsserviços que interagem com bancos de dados relacionais. Essa técnica se integra com tecnologias como ORMs (Object-Relational Mappers) e drivers de banco de dados.
As vantagens do connection pooling são a melhoria significativa do desempenho, a redução do consumo de recursos e o aumento da escalabilidade. A principal desvantagem é a complexidade adicional na configuração e gerenciamento do pool.
Implementação Prática (10 min)
// Importa os módulos necessários
const express = require('express');
const { Pool } = require('pg');
// Configura o pool de conexões
const pool = new Pool({
user: 'seu_usuario',
host: 'seu_host',
database: 'seu_banco_de_dados',
password: 'sua_senha',
port: 5432, // Porta padrão do PostgreSQL
max: 10, // Número máximo de conexões no pool
idleTimeoutMillis: 30000, // Tempo máximo de inatividade de uma conexão
connectionTimeoutMillis: 2000, // Tempo limite para estabelecer uma conexão
});
const app = express();
app.get('/usuarios', async (req, res) => {
try {
// Obtém uma conexão do pool
const client = await pool.connect();
// Executa a query
const result = await client.query('SELECT FROM usuarios');
// Libera a conexão de volta para o pool
client.release();
// Retorna os resultados
res.json(result.rows);
} catch (error) {
console.error('Erro ao buscar usuários:', error); // Logging profissional
res.status(500).json({ error: 'Erro ao buscar usuários' });
}
});
// Inicia o servidor na porta 3000
app.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Este código cria um pool de conexões com o PostgreSQL. A rota /usuarios obtém uma conexão do pool, executa uma query e devolve a conexão. O try...catch garante o error handling, e o logging ajuda no debug. As configurações de max, idleTimeoutMillis e connectionTimeoutMillis permitem um ajuste fino do pool.
Exercício Hands-On (5 min)
Crie uma nova rota /produtos que busque todos os produtos de uma tabela produtos. Utilize o mesmo padrão de código da rota /usuarios, adaptando a query SQL. Teste a rota com diferentes requisições simultâneas para observar os benefícios do connection pooling.
Solução:
app.get('/produtos', async (req, res) => {
try {
const client = await pool.connect();
const result = await client.query('SELECT FROM produtos');
client.release();
res.json(result.rows);
} catch (error) {
console.error('Erro ao buscar produtos:', error);
res.status(500).json({ error: 'Erro ao buscar produtos' });
}
});
Para testar, faça várias requisições para a rota /produtos. Observe os logs do servidor para verificar se as conexões estão sendo reutilizadas. Para troubleshooting, verifique as configurações do pool e a string de conexão com o banco de dados. Próximos passos: explore outras opções de configuração do pool e pesquise sobre diferentes bibliotecas de connection pooling para Node.js.
🚀 Pronto para a próxima aula?
Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!