【问题标题】:Will spring Boot datasource properties work if we configure datasource programmatically in Spring Boot如果我们在 Spring Boot 中以编程方式配置数据源,Spring Boot 数据源属性会起作用吗
【发布时间】:2018-11-25 11:08:15
【问题描述】:

如果我们以编程方式配置数据源,Spring Boot 数据源属性会起作用吗?

仅当我从 application.properties 获取数据库配置时,以下属性才有效。如果我以编程方式配置数据源,则以下属性不起作用。

spring.datasource.tomcat.initial-size=10
spring.datasource.tomcat.max-active=10
spring.datasource.tomcat.max-idle=5
spring.datasource.tomcat.min-idle=5

我使用以下代码以编程方式配置数据源

@ConfigurationProperties(prefix = "spring.datasource")
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder.create().username(userName).password(password).url(url).driverClassName(driverName)
            .build();
}

为了使它以编程方式工作,我使用了以下代码 sn-p。但我不相信。我觉得这不是一个更清洁的解决方案。我必须从 application.properties 中读取至少 20 个属性并将其添加到 PoolProperties。

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    @Primary
    public DataSource dataSource() {
        PoolProperties poolProperties = new PoolProperties();
        poolProperties.setUrl(url);
        poolProperties.setDriverClassName(driverName);
        poolProperties.setUsername(userName);
        poolProperties.setPassword(password);
        poolProperties.setTestWhileIdle(false);
        poolProperties.setTestOnBorrow(true);
        poolProperties.setValidationQuery("SELECT 1 FROM DUAL");
        poolProperties.setTestOnReturn(false);
        poolProperties.setValidationInterval(30000);
        poolProperties.setTimeBetweenEvictionRunsMillis(30000);
        poolProperties.setInitialSize(10);
        poolProperties.setMaxActive(10);
        poolProperties.setMaxIdle(5);
        poolProperties.setMinIdle(5);
        poolProperties.setMaxWait(10000);
        poolProperties.setRemoveAbandonedTimeout(60);
        poolProperties.setMinEvictableIdleTimeMillis(30000);
        poolProperties.setLogAbandoned(true);
        poolProperties.setRemoveAbandoned(true);
        DataSource datasource = new DataSource(); // import org.apache.tomcat.jdbc.pool.DataSource;
        datasource.setPoolProperties(poolProperties);
        return datasource;
    }

我们可以让以下默认的 Spring Boot 属性工作吗?

spring.datasource.tomcat.initial-size=10
spring.datasource.tomcat.max-active=10
spring.datasource.tomcat.max-idle=5
spring.datasource.tomcat.min-idle=5

【问题讨论】:

  • 您已经在使用受支持的数据源,为什么还要手动配置它?您设置的所有属性都是可配置的,通过添加编程配置可以获得什么?如果你真的想要,你需要在你的情况下指定正确的前缀spring.datasource.tomcat。但正如您在此处发布的内容所述,以编程方式添加它一无所获。
  • 实际上我是从 Hashicorp Vault 获取数据库密码,这就是我手动配置它的原因。当我以编程方式执行初始大小时,最大活动,最大空闲,最小空闲...... application.properties 上的设置不起作用。如何让它发挥作用?
  • 使保管库属性成为常规过程的一部分,而不是进行手动配置。编写一个 ApplicationContextInitializer 注册一个基于 Vault 的 PropertySource 并将其添加到 PropertySources 的列表中。这样你就可以使用 Spring Boot 提供的所有功能。
  • 我会尝试 ApplicationContextInitializer 并更新您。感谢您的评论。
  • 这对我来说也很痛苦

标签: spring spring-boot tomcat connection datasource


【解决方案1】:

记得在这样的属性文件中从属性中为 db 提供 tomcat。

# Oracle DB - "foo"
spring.datasource.tomcat.url=jdbc:oracle:thin:@//db-server-foo:1521/FOO
spring.datasource.tomcat.username=fooadmin
spring.datasource.tomcat.password=foo123
spring.datasource.tomcat.initial-size=10
spring.datasource.tomcat.max-active=10
spring.datasource.tomcat.max-idle=5
spring.datasource.tomcat.min-idle=5

然后像这样配置数据源。

 /**
 * Auto-configured DataSource
 */
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

【讨论】:

  • 我从 Vault 而不是从属性文件中获取我的数据库密码。我没有得到一个带有 Vault 的 ApplicationContextInitializer 的简单示例。
  • 您可以先单独获取该值,然后像您在第一个代码中所做的那样单独设置密码。您说第一个以编程方式执行的代码不起作用,因为您没有在 @ConfigurationProperties(prefix = "spring.datasource.tomcat") 中提供 tomcat
  • 面临与 HikariDatasource 相同的问题......并且正是@ThiagarajanRamanathan 提到......我还从 AWS Secret Manager 获取密码,因此必须同时具有基于动态和属性文件的数据源配置。任何帮助将不胜感激。
猜你喜欢
  • 2018-06-14
  • 2016-01-17
  • 2015-01-26
  • 2021-09-24
  • 1970-01-01
  • 2019-03-18
  • 2021-03-16
相关资源
最近更新 更多