Это пул соединений — connection pool. Он выдаёт соединение для операции, а затем обычно сохраняет его для повторного использования вместо нового подключения на каждый запрос. Лимит открытых соединений задают отдельно; при исчерпании пула операции могут ждать освобождения ресурса. В Go sql.DB уже управляет таким пулом, а не представляет одно физическое соединение.
Как называется механизм переиспользования ограниченного числа соединений с базой данных?
Пул соединений с БД: занятые и свободные соединения, ожидание ресурса, предел размера и корректное освобождение. Пример настроек database/sql в Go.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Механизм называется пулом соединений, или connection pool. Он переиспользует подключения, снижая расходы на установление сетевого соединения, аутентификацию и подготовку сессии. Открытое соединение может быть занято операцией или свободно внутри пула; слово «активные» не всегда означает выполняющие запрос.
Типичный цикл: приложение запрашивает ресурс, пул предоставляет доступное соединение или создаёт новое в пределах настроенного лимита, операция выполняется, ресурс возвращается для последующего использования. При достижении лимита требуется ожидание либо отказ по правилам конкретной реализации и сроку запроса.
В Go объект *sql.DB уже содержит пул и рассчитан на совместное использование. Его не нужно открывать заново для каждого HTTP-запроса. Пример настроек существующего db:
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxIdleTime(5 * time.Minute)
db.SetConnMaxLifetime(30 * time.Minute)
Для примера нужен импорт time. Числа иллюстративные: это не универсальные рекомендуемые значения. Предел открытых соединений включает занятые и свободные; размер свободной части и сроки использования задаются отдельно. См. управление соединениями в Go.
Пул не делает бесконечную нагрузку безопасной. При выборе размера учитывают возможности БД, длительность операций и суммарные лимиты всех экземпляров приложения. Слишком большой пул способен увеличить конкуренцию и ухудшить задержки.
Важно вовремя закрывать результаты запросов, завершать транзакции и освобождать явно полученные соединения согласно контракту библиотеки. Иначе ресурс останется занят, а новые запросы будут ждать. Для диагностики смотрят занятые и свободные подключения, количество и длительность ожиданий, медленные запросы и блокировки. Увеличение лимита без выяснения причины не устраняет утечку ресурса.