Короткий ответ
Исчерпание пула соединений диагностируют по росту времени ожидания свободного соединения и ошибкам «pool exhausted»; типичные причины — соединения не возвращаются в пул, слишком маленький размер пула или долгие транзакции, держащие соединение дольше необходимого.
Как это работает подробнее
Пул хранит ограниченное число открытых соединений; каждый запрос берёт соединение на время работы и должен его вернуть; при ошибке логики без try/finally или context manager пул постепенно исчерпывается.
Пример кода
example.py
def get_user(user_id):
with pool.connection() as conn: # context manager гарантирует возврат в пул
cursor = conn.execute("SELECT * FROM users WHERE id = %s", [user_id])
return cursor.fetchone()Что использовать на практике
- Практика. Сначала смотрят метрики пула (используемые/свободные соединения), затем ищут в коде места без context manager, долгие транзакции (например, вызов внешнего API внутри открытой транзакции БД) и утечки в обработчиках исключений.
Подводные камни
- Риск. Увеличивать размер пула как «быстрое решение» без поиска утечки; держать транзакцию БД открытой во время сетевого вызова к другому сервису.