Перейти к содержимому
Skip to content
← Все статьи

Пул соединений с БД: как работает и лучшие практики

Зачем нужен пул соединений

Каждый запрос к базе данных требует соединения. Создание нового соединения включает TCP-handshake, аутентификацию, выделение памяти на сервере БД и инициализацию сессии. Для MySQL это занимает 5–50 мс. Для PostgreSQL — 50–100 мс из-за форка процесса. Умножьте это на тысячи запросов в секунду, и накладные расходы на соединения становятся серьёзным узким местом.

Пул соединений решает эту проблему, поддерживая набор заранее установленных соединений, которые разделяются между запросами. Вместо создания и уничтожения соединений приложение берёт соединение из пула, использует его и возвращает обратно. Результат: значительно меньшая задержка, более высокая пропускная способность и сниженная нагрузка на сервер БД.

Как работает пул соединений

Пул соединений — это кэш подключений к базе данных. Жизненный цикл:

Настройка размера пула

Самая критичная настройка. Слишком мал — запросы встают в очередь за соединениями, увеличивая задержку. Слишком велик — база данных перегружена параллельными соединениями, каждое из которых потребляет память и CPU.

ПараметрОписаниеТипичное значение
min_pool_sizeСоединения, создаваемые при старте5–10
max_pool_sizeМаксимальное число одновременных соединений20–50
idle_timeoutЗакрытие простаивающих соединений после300 с
connection_timeoutМаксимальное ожидание соединения из пула5–30 с
max_lifetimeЗакрытие соединения после общего времени жизни1800 с

Формула оптимального размера пула

Широко цитируемая формула из вики PostgreSQL:

pool_size = (количество_ядер * 2) + количество_дисков

Пример для 4-ядерного сервера с SSD:
pool_size = (4 * 2) + 1 = 9

Это отправная точка, а не окончательный ответ. Правильный размер зависит от длительности запросов, паттернов конкурентности и типа нагрузки (CPU-bound или I/O-bound). Профилируйте под реалистичной нагрузкой.

Распространённая ошибка — слишком большой пул. Производительность PostgreSQL значительно деградирует при более чем ~100 соединениях из-за конкуренции за блокировки и переключения контекста. MySQL выдерживает больше, но тоже страдает при 200–300+.

Пул соединений в PHP

Жизненный цикл PHP-запроса создаёт уникальную проблему: каждый запрос обычно создаёт новое соединение с БД и уничтожает его в конце. Нативный PHP не имеет встроенного пулирования. Решения:

// PHP PDO persistent connection
$pdo = new PDO(
    'mysql:host=localhost;dbname=myapp',
    'user',
    'password',
    [PDO::ATTR_PERSISTENT => true]
);

// С ProxySQL — подключение через прокси вместо MySQL напрямую
$pdo = new PDO(
    'mysql:host=127.0.0.1;port=6033;dbname=myapp',
    'user',
    'password'
);

Пул соединений с PgBouncer

PgBouncer — самый популярный пулер для PostgreSQL. Он располагается между приложением и PostgreSQL, управляя пулом серверных соединений:

# /etc/pgbouncer/pgbouncer.ini
[databases]
myapp = host=127.0.0.1 port=5432 dbname=myapp

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 25
min_pool_size = 5
reserve_pool_size = 5
reserve_pool_timeout = 3

PgBouncer поддерживает три режима пулирования:

Мониторинг пулов соединений

Метрики для отслеживания:

-- MySQL: проверка активных соединений
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Threads_running';
SHOW STATUS LIKE 'Max_used_connections';

-- PostgreSQL: проверка соединений
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;

Типичные ошибки

Лучшие практики

Заключение

Пулирование соединений — одна из самых эффективных и простых в реализации оптимизаций для приложений, работающих с базами данных. Оно снижает задержку, увеличивает пропускную способность и защищает БД от «штормов» соединений. Выберите правильную стратегию для вашего стека, тщательно настройте размеры пулов, мониторьте насыщение и избегайте утечек. Результат будет немедленным и измеримым.

Проверьте ваш сайт прямо сейчас

Проверить →
Другие статьи: Инфраструктура
Инфраструктура
Мульти-CDN стратегия: отказоустойчивость, оптимизация затрат и распределение трафика
16.03.2026 · 27 просм.
Инфраструктура
Алгоритмы балансировки нагрузки: Round Robin, Least Connections и другие
16.03.2026 · 14 просм.
Инфраструктура
Стратегии версионирования API: URL, заголовки и параметры запроса
16.03.2026 · 22 просм.
Инфраструктура
Оптимизация производительности Nginx: ключевые настройки
16.03.2026 · 23 просм.