John Little
John Little

Reputation: 12447

How to configure spring.datasource.hikari.maximumPoolSize when using a DataSource Bean in Spring Boot

SB 3.4.2, Java 21

We can't use the autowired datasource as we are getting database credentials etc. from AWS Secrets manager.

In our application.properties, these are being ignored:

spring.datasource.hikari.connectionTimeout=60000
spring.datasource.hikari.maximumPoolSize=50
spring.datasource.hikari.idleTimeout=1200000 
spring.datasource.hikari.maxLifetime=3000000 
spring.datasource.hikari.poolName=my-pool

The config bean looks like this:

@Configuration
public class DataSourceConfig extends HikariConfig {
    @Bean
    public DataSource getDataSource() {

        DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName(driverClassName);
        awsSecretsManagerUtility().setSecretName(dbSecretName);
        AWSSecretsManagerUtility.RDSSecret rdsSecret = awsSecretsManagerUtility().getSecretData(AWSSecretsManagerUtility.RDSSecret.class);
        url = String.format("jdbc:postgresql://%s:%s/%s", rdsSecret.getHost(), rdsSecret.getPort(), rdsSecret.getDbname());
        username = rdsSecret.getUsername();
        password = rdsSecret.getPassword();

        dataSourceBuilder.url(url);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }

      @Bean
        public AWSSecretsManagerUtility awsSecretsManagerUtility() {
            return new AWSSecretsManagerUtility();
        }

The output we get when the app starts is

Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)']
Database driver: undefined/unknown
Database version: 16.2
Autocommit mode: undefined/unknown
Isolation level: undefined/unknown
Minimum pool size: undefined/unknown
Maximum pool size: undefined/unknown

How can we configure connection properties?

I tried adding this to the DataSourceConfig but it didn't help:

    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties regularDataSourceProperties() {
        return new DataSourceProperties();
    }

We also tried these alternative names:

spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.pool-name=my-pool

Upvotes: -1

Views: 20

Answers (1)

M. Deinum
M. Deinum

Reputation: 125202

Ignore the output from HIbernate, it doesn't tell you anything. See Problems with Hibernate startup logging after adding JPA with database in SpringBoot version 3.4.0

Use the DataSourceProperties to get the builder, don't extend HikariConfig in your @Configuration class.

NOTE: I Assume that awsSecretsManagerUtility actually is an @Bean method and creates a bean. So why not simply inject it.

@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    public DataSource dataSource(
      AWSSecretsManagerUtility awsSecretsManagerUtility,
      DataSourceProperties props) {   
        awsSecretsManagerUtility().setSecretName(dbSecretName);

        var rdsSecret = awsSecretsManagerUtility().getSecretData(AWSSecretsManagerUtility.RDSSecret.class);
        var url = String.format("jdbc:postgresql://%s:%s/%s", rdsSecret.getHost(), rdsSecret.getPort(), rdsSecret.getDbname());
        props.setUrl(url);
        props.setUsername(rdsSecret.getUsername());
        props.setPassword(rdsSecret.getPassword());
        return props.initializeDataSourceBuilder().build();
    }

No the spring.datasource properties will still be applied.

Upvotes: 1

Related Questions