如果我们在SpringBoot中以编程方式配置数据源,那么SpringBoot数据源属性会起作用吗

如果我们在SpringBoot中以编程方式配置数据源,那么SpringBoot数据源属性会起作用吗,spring,spring-boot,tomcat,connection,datasource,Spring,Spring Boot,Tomcat,Connection,Datasource,如果我们以编程方式配置数据源,Spring Boot数据源属性会起作用吗 仅当我从application.properties获取DB配置时,以下属性才起作用。如果以编程方式配置数据源,则以下属性不起作用 spring.datasource.tomcat.initial-size=10 spring.datasource.tomcat.max-active=10 spring.datasource.tomcat.max-idle=5 spring.datasource.tomcat.min-id

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

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

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();
}
为了使它以编程方式工作,我使用了以下代码段。但我不相信。我觉得这不是一个更干净的解决办法。我必须从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引导属性正常工作

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

记住在属性文件中为db提供tomcat from属性,如下所示

# 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();
}
然后像这样配置数据源

# 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();
}

您已经在使用受支持的数据源,为什么要手动配置它?您设置的所有属性都是可配置的,添加编程配置有什么好处?如果确实需要,则需要在本例中指定适当的前缀
spring.datasource.tomcat
。但正如您在这里发布的内容所述,通过编程方式添加它,您将一无所获。实际上,我正在从Hashicorp Vault获取数据库密码,这就是我手动配置它的原因。当我以编程方式执行时,初始大小、最大活动、最大空闲、最小空闲。。。。application.properties上的设置不起作用。如何使其工作?将vault特性作为常规过程的一部分,而不是手动配置。编写一个
ApplicationContextInitializer
,它注册基于Vault的
PropertySource
,并将其添加到
PropertySource
列表中。这样您就可以使用Spring Boot提供的所有功能。我将尝试ApplicationContextInitializer并更新您。谢谢你的评论。这对我来说真的很痛苦,因为我是从Vault而不是从属性文件获取DB密码的。我没有得到一个简单的例子来说明带Vault的ApplicationContextInitializer。您可以先单独获取该值,然后像在第一个代码中那样单独设置密码。您告诉我,第一个以编程方式执行的代码不起作用,因为您没有在@ConfigurationProperties(prefix=“spring.datasource.tomcat”)中为tomcat提供与HikariDatasource相同的问题。。。而正是@ThiagarajanRamanathan提到的。。。我还从AWS Secret Manager获取密码,因此必须同时进行动态和基于属性文件的数据源配置。任何帮助都将不胜感激。