В чем могут быть проблемы с базой данных кроме долгих запросов
Что проверяют
Работали ли вы с базой в нагруженном сервисе, а не только писали запросы. Интервьюер ждёт проблем из практики Java-бэкенда: пул соединений, блокировки, транзакции, миграции. Следом спрашивают, как вы это диагностировали.
Как отвечать
Назовите проблемы и к каждой дайте симптом и лечение:
- исчерпание пула: у HikariCP по умолчанию
maximumPoolSizeравен 10,connectionTimeout30 секунд. Запросы быстрые, но потоки ждут свободное соединение и падают по таймауту; - длинные транзакции:
@Transactionalвокруг HTTP-вызова во внешний сервис держит соединение всё время ожидания. Похожий эффект даётspring.jpa.open-in-view, в Spring Boot он включён по умолчанию. Утечки ловитleakDetectionThreshold; - лимит на сервере: у PostgreSQL
max_connectionsпо умолчанию 100. Тридцать подов с пулом по 10 уже не помещаются, нужен PgBouncer или пересчёт пулов; - N+1: Hibernate делает сотни быстрых запросов вместо одного. Лечится
JOIN FETCH,@EntityGraph, batch fetching; - блокировки и дедлоки: транзакции обновляют одни строки в разном порядке. Потерянные обновления закрывает оптимистическая блокировка через
@Version; - миграции: большинство форм
ALTER TABLEберутACCESS EXCLUSIVE, встают в очередь за долгой транзакцией и останавливают все запросы к таблице. Индекс на живой таблице строят черезCREATE INDEX CONCURRENTLY; - реплики: чтение с реплики сразу после записи возвращает старые данные;
- раздувание: долгие транзакции в PostgreSQL мешают VACUUM убирать старые версии строк.
Для диагностики назовите pg_stat_activity, pg_locks и метрики пула через Micrometer, например число потоков в ожидании соединения.
Где спотыкаются
Отвечают общими словами про «безопасность и бэкапы» без единого механизма из Java-стека.
Лечат нехватку соединений увеличением пула до сотни. Обычно проблема в том, что соединение держат слишком долго, а большой пул только перегружает базу.
Не считают N+1 проблемой, потому что каждый запрос в логе быстрый. Суммарно страница ждёт сотни обменов с базой.