Пулы подключений

Последнее обновление: 28.04.2019

Драйвер 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() отправит запрос к базе данных. В итоге при таком сценарии мы получим ошибку.

Promise API

Так же, как и объкты подключений, пулы поддерживают работу с промисами:

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);
    });
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850