【问题标题】:Spring Boot verify Datasource connectionSpring Boot 验证数据源连接
【发布时间】:2020-02-11 05:18:12
【问题描述】:

在 Spring Boot 中,有没有办法验证 DataSourceAutoConfiguration 创建的 Datasource 是否有效以及是否可以创建连接?

我们正在使用 Spring Boot 2.1.2 以及 Hikari 3.2.0 和 Flyway 5.2.4。

我遇到的问题是,当我们的数据源无法访问时,我想发出警报。这可能是由于数据库未正确命名或在应用程序仍在初始化时 RDS 服务器已关闭。

我对启动顺序的理解是:

  1. Spring Boot 初始化数据源
  2. Flyway 运行迁移
  3. 数据库连接池已初始化
  4. 休眠初始化

我想做的是在 Flyway 运行之前验证在步骤 1 中创建的数据源。 Flyway 确实有一个回调系统,但它仅在迁移运行时有效,而在无法从数据库获得连接时无效。我知道 SpringBoot 提供的 DataSourceHealthIndicator,但据我所知,这仅在调用 Actuator 端点时运行。有没有办法验证数据源(创建新连接)或强制在 Flyway 自动配置之前调用 DataSourceHealthIndicator?

【问题讨论】:

    标签: spring-boot datasource flyway


    【解决方案1】:

    通过添加自定义 DB HealthCheck,我能够在 Flyay 初始化之前成功测试 DataSource。当 bean 初始化时,我立即检查数据库的健康状况。如果数据库检查失败,我的实现将向外部源发出警报。

    @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;
        }
    }
    
    

    【讨论】:

    • 很棒的发现!很高兴你明白了。
    【解决方案2】:

    也许您可以配置连接测试。

    c3p0 可以配置为测试它以各种方式汇集的连接。 idleConnectionTestPeriodtestConnectionOnCheckouttestConnectionOnCheckin 控制何时测试连接。 automaticTestTableconnectionTesterClassNamepreferredTestQuery 控制它们的测试方式。以下是更多信息的链接: https://www.mchange.com/projects/c3p0/#configuring_connection_testing

    虽然容易出错,但另一种可能性是使用以下代码注释使用 JdbcTemplate 的组件:

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

    这将在 Flyway 和您的配置类之间建立依赖关系。

    【讨论】:

    • Hikari 连接池为测试连接提供相同的支持。
    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2018-06-13
    • 2019-09-24
    • 1970-01-01
    • 2014-08-16
    • 2014-08-10
    相关资源
    最近更新 更多