Pool de Conexões no MySQL com 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);
});
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.