Короткий ответ
Установка соединения с БД — относительно дорогая операция (TCP-хендшейк, аутентификация, настройка сессии), и открытие нового соединения на каждый запрос резко увеличивает задержку и нагрузку на БД; пул поддерживает заранее открытые соединения и переиспользует их между запросами.
Как это работает подробнее
Пул создаёт и хранит ограниченное число живых соединений; при обращении из кода соединение берётся из пула, используется и возвращается обратно, а не закрывается физически, что устраняет повторные затраты на установку соединения.
Пример кода
example.py
from sqlalchemy import create_engine
engine = create_engine(
"postgresql://user:pass@localhost/db",
pool_size=10,
max_overflow=5,
)
with engine.connect() as conn: # соединение берётся из пула и возвращается автоматически
conn.execute(text("SELECT 1"))Что использовать на практике
- Практика. Размер пула подбирают с учётом числа воркеров приложения и лимитов самой БД на одновременные соединения (max_connections в PostgreSQL); слишком большой пул может исчерпать лимиты БД при масштабировании нескольких инстансов приложения.
Подводные камни
- Риск. Забывают возвращать соединение в пул (не закрывают курсор/сессию в блоке finally или контекстном менеджере), из-за чего пул исчерпывается под нагрузкой; создают новый пул на каждый запрос вместо одного общего на процесс/приложение.