Драйвер mysql2 позволяет создавать пулы подключений. Пулы подключений позволяют уменьшить время, затраченное на подключение к серверу MySQL, благодаря повторному использованию подключений. Когда баз данных посылается запрос, из пула выбиратся свобное подключение (или создается новое, если сводобных нет и не превышен лимит). Это позволяет снизить издержки на создание новых подключений.
Пул подключений создается с помощью функции createPool(). Например, создадим пул из пяти подключений:
const mysql = require("mysql2"); const pool = mysql.createPool({ connectionLimit: 5, host: "localhost", user: "root", password: "пароль_от_сервера_mysql", database: "usersdb" });
Параметр connectionLimit определяет максимальное количество подключений. Причем даже если мы определим 100 подключений, но приложениею требуется только 5 подключений, то соответственно будет создаваться и использоваться только 5 подключений.
Для закрытия всех подключений применяется метод end():
pool.end(function(err) { if (err) { return console.log(err.message); } });
Запросы к бд через пул подключений выполняются через метод query() также, как и в объекте connection, который рассматривался в прошлых темах:
const mysql = require("mysql2"); const pool = mysql.createPool({ connectionLimit: 5, host: "localhost", user: "root", database: "usersdb2", password: "123456" }); // добавление объекта 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); }); // получение объектов pool.query("SELECT * FROM users", function(err, results) { if(err) console.log(err); console.log(results); });
Обратите внимание, что в случае выше запросы выполняются не последовательно. Поскольку оба вызова метода query выполняются асинхронно, то соответственно нет никакой гарантии, что вначале произойдет добавление, а потом получение объектов.
То же самое следует учитывать и при вызове метода end() у пула подключений:
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.end()
- до того, как ранее вызванный метод
pool.query()
отправит запрос к базе данных. В итоге при таком сценарии мы получим ошибку.
Так же, как и объкты подключений, пулы поддерживают работу с промисами:
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); });
Благодаря промисам мы можем обойти вышеописанную проблему с вызовом метода end после операции с данными:
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"]) // изменение объектов .then(result =>{ console.log(result[0]); return pool.execute("SELECT * FROM users"); // получение объектов }) .then(result =>{ console.log(result[0]); pool.end(); }) .then(()=>{ console.log("пул закрыт"); }) .catch(function(err) { console.log(err.message); });