Spring Boot проверяет соединение с источником данных - PullRequest
1 голос
/ 14 октября 2019

В Spring Boot, есть ли способ проверить, что источник данных, созданный DataSourceAutoConfiguration, действителен и что соединение может быть создано?

Мы используем Spring Boot 2.1.2 вместе с Hikari 3.2.0 и Flyway 5.2.4.

Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы поднять предупреждениекогда наш источник данных недоступен. Это может быть связано с тем, что база данных не была названа правильно или сервер RDS не работает, когда приложение все еще инициализируется.

Как я понимаю порядок запуска:

  1. Spring Boot инициализирует источник данных
  2. Flyway выполняет миграцию
  3. Инициализирован пул соединений с БД
  4. Hibernate инициализирует

Что я хотел бы сделать - это проверить источник данных, созданный на шаге 1, до запуска Flyway. Flyway имеет систему обратного вызова, но она работает только при выполнении миграций, а не тогда, когда не может получить соединение с БД. Я знаю о DataSourceHealthIndicator, который предоставляет SpringBoot, но, насколько я могу судить, он запускается только тогда, когда вызывается конечная точка Actuator. Есть ли способ проверить источник данных (создать новое соединение) или принудительно вызвать DataSourceHealthIndicator перед автоматической настройкой Flyway?

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Мне удалось успешно протестировать источник данных перед инициализацией Flyay, добавив специальную базу данных HealthCheck. Когда компонент инициализируется, я немедленно проверяю работоспособность базы данных. Моя реализация предупредит внешний источник, если проверка базы данных не удалась.

@Configuration
public class NotifiyingDataSourceHealthCheckConfig extends DataSourceHealthIndicatorAutoConfiguration {

    @Value("${aws.accessKeyId}")
    private String awsAccessKeyId;

    @Value("${aws.secretKey}")
    private String awsSecret;

    @Value("${aws.alertQueueName}")
    private String alertQueueName;

    @Value("${aws.region}")
    private String awsRegion;

    public NotifiyingDataSourceHealthCheckConfig( ObjectProvider<Map<String, DataSource>> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders ) {
        super( dataSources, metadataProviders );
    }

    @Bean(name = "dbHealthIndicator")
    public HealthIndicator dbHealthIndicator() {
        BasicAWSCredentials credentials = new BasicAWSCredentials( awsAccessKeyId, awsSecret );
        AmazonSQSAsync amazonSQS = AmazonSQSAsyncClientBuilder.standard().withCredentials( new AWSStaticCredentialsProvider( credentials ) ).withRegion( awsRegion ).build();

        HealthIndicator healthIndicator =  new NotifiyingHealthIndicatorWrapper( super.dbHealthIndicator(), amazonSQS, alertQueueName, "frequent-flyer-api", "db" );
        healthIndicator.health();
        return  healthIndicator;
    }
}

0 голосов
/ 14 октября 2019

Возможно, вы можете настроить тестирование соединения.

c3p0 можно настроить для проверки подключений, которые он создает различными способами. idleConnectionTestPeriod, testConnectionOnCheckout и testConnectionOnCheckin управляют проверкой соединений. automaticTestTable, connectionTesterClassName и preferredTestQuery определяют способ их проверки. Вот ссылка для получения дополнительной информации: https://www.mchange.com/projects/c3p0/#configuring_connection_testing

Другая возможность, хотя и подвержена ошибкам, состоит в том, чтобы аннотировать компонент, который использует JdbcTemplate, с помощью:

@DependsOn({"flyway", "flywayInitializer"})

Это установит зависимость между Flywayи ваш класс конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...