Задержка запуска приложения SpringBoot до загрузки базы данных

#java #spring #spring-boot #kubernetes #spring-retry

#java #весна #весенняя загрузка #kubernetes #весна-повторите попытку

Вопрос:

У меня есть приложение SpringBoot, которое не сможет запуститься, когда используемая им база данных не запущена, поскольку компонент datasource не сможет инициализироваться. Я хочу, чтобы мое приложение не запускалось до запуска моей базы данных, чтобы избежать этого сбоя.

Следует упомянуть, что это приложение работает в Kubernetes, поэтому одним из вариантов может быть использование init-контейнера. Я бы хотел, чтобы эта логика была внутри самого приложения.

Прежде всего, это плохая идея, и я должен придерживаться init-контейнеров?

Если это неплохая идея, каков обычно наилучший подход для этого. Я рассматривал повторную попытку Spring, и, по-видимому, одним из возможных решений является наличие логики повторных попыток в методе инициализации @Bean datasource. Есть ли у этого какие-либо возможные недостатки? Есть ли лучший способ?

Комментарии:

1. Пожалуйста, проверьте эту ссылку deinum.biz/2020-06-30-Wait-for-database-startup

2. Возможно, я что-то упускаю, но там кажется, что для его работы необходимо создать объект источника данных. Моя проблема в том, что мой компонент источника данных завершается с ошибкой при создании, потому что ему необходимо подключиться к БД.

Ответ №1:

Не уверен, работает ли это для вас, но в случае, если у вас объявлены компоненты источника данных.

Вы можете @Lazy annotation отложить инициализацию компонента до тех пор, пока это не потребуется.

Запуск вашего приложения не должен завершаться сбоем при запуске, поскольку компонент источника данных не будет инициализирован до тех пор, пока это не потребуется

Комментарии:

1. Неплохое предложение. Но если приложение запускается и получает запросы до того, как база данных будет готова, я все равно получу сообщение об ошибке.

2. Возможно, обходным путем может быть изменение логики приложения, чтобы не инициализировать компонент источника данных до тех пор, пока Db не будет обновлен. Хотя это утверждение кажется немного странным

Ответ №2:

У вас может быть пробный запуск для проверки соединений с БД при запуске. Если вы хотите, чтобы соединения с БД постоянно объединялись для поддержания работоспособности, вы можете использовать другие проблемы. Или в конвейере, который вы используете для развертывания, после этапов проверки сборки, вы можете добавить шаг для проверки подключений внешних служб / БД, которые вы используете.