Atualizado: 02/01/2025

Pool de Conexões - Node.js

O mysql2 permite a criação de pools de conexões. Esses pools de conexões reduzem o tempo gasto para conectar ao servidor MySQL, reutilizando as conexões. Quando uma consulta é enviada ao banco de dados, uma conexão livre é selecionada do pool (ou uma nova é criada, caso não haja conexões disponíveis e o limite não tenha sido excedido). Isso reduz os custos associados à criação de novas conexões.

Um pool de conexões é criado com a função createPool(). Por exemplo, vamos criar um pool com cinco conexões:

const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    password: "senha_do_servidor_mysql",
    database: "usersdb"
});

O parâmetro connectionLimit define o número máximo de conexões. Mesmo que seja definido um limite de 100 conexões, se a aplicação precisar de apenas 5, somente essas 5 conexões serão criadas e usadas.

Para encerrar todas as conexões, usa-se o método end():

pool.end(function(err) {
    if (err) {
        return console.log(err.message);
    }
});

Consultas ao Banco de Dados

Consultas ao banco de dados por meio de um pool de conexões são executadas com o método query(), da mesma forma que em um objeto connection, como visto em tópicos anteriores:

const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456"
});

// adicionando um objeto
const sql = "INSERT INTO users (name, age) VALUES(?, ?)";
const data = ["Bill", 25];
pool.query(sql, data, function(err, results) {
    if(err) console.log(err);
    console.log(results);
});

// obtendo objetos
pool.query("SELECT * FROM users", function(err, results) {
    if(err) console.log(err);
    console.log(results);
});
const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456"
});

// adicionando um objeto
const sql = "INSERT INTO users (name, age) VALUES(?, ?)";
const data = ["Bill", 25];
pool.query(sql, data, function(err, results) {
    if(err) console.log(err);
    console.log(results);
});

// obtendo objetos
pool.query("SELECT * FROM users", function(err, results) {
    if(err) console.log(err);
    console.log(results);
});

Note que, no caso acima, as consultas não são executadas de forma sequencial. Como ambas as chamadas ao método query são assíncronas, não há garantia de que a inserção ocorrerá antes da consulta para obter os objetos.

O mesmo cuidado deve ser tomado ao chamar o método end() no pool de conexões:

const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456"
});

pool.query("SELECT * FROM users", function(err, results) {
    if(err) console.log(err);
    console.log(results);
});

pool.end(function(err) {
    if (err) {
    console.log(err.message);
    }
    console.log("pool encerrado");
});

Nesse caso, pode acontecer de o método pool.end() ser executado antes que o método pool.query() envie a consulta ao banco de dados. Isso resultaria em um erro.

Promise API

Assim como os objetos de conexão, os pools de conexões também suportam o uso de Promises:

const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456"
}).promise();

pool.execute("SELECT * FROM users")
    .then(result => {
    console.log(result[0]);
    })
    .catch(function(err) {
    console.log(err.message);
    });

Com Promises, é possível contornar o problema descrito anteriormente com a chamada ao método end após a operação com os dados:

const mysql = require("mysql2");

const pool = mysql.createPool({
    connectionLimit: 5,
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456"
}).promise();

pool.execute("UPDATE users SET age=age+1 WHERE name=?", ["Stan"]) // modificando objetos
    .then(result => {
    console.log(result[0]);
    return pool.execute("SELECT * FROM users"); // obtendo objetos
    })
    .then(result => {
    console.log(result[0]);
    pool.end();
    })
    .then(() => {
    console.log("pool encerrado");
    })
    .catch(function(err) {
    console.log(err.message);
    });

No exemplo acima, a chamada ao método end é feita somente após a execução das consultas e a manipulação dos dados.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com