javaspringjdbcspring-boottomcat-jdbc

Spring-Boot: How do I set JDBC pool properties like maximum number of connections?


Spring-Boot is a pretty awesome tool, but the documentation is a bit sparse when it comes to more advanced configuration. How can I set properties like the maximum size for my database connection pool?

Spring-Boot supports tomcat-jdbc, HikariCP and Commons DBCP natively are they all configured the same way?


Solution

  • It turns out setting these configuration properties is pretty straight forward, but the official documentation is more general so it might be hard to find when searching specifically for connection pool configuration information.

    To set the maximum pool size for tomcat-jdbc, set this property in your .properties or .yml file:

    spring.datasource.maxActive=5
    

    You can also use the following if you prefer:

    spring.datasource.max-active=5
    

    You can set any connection pool property you want this way. Here is a complete list of properties supported by tomcat-jdbc.

    To understand how this works more generally you need to dig into the Spring-Boot code a bit.

    Spring-Boot constructs the DataSource like this (see here, line 102):

    @ConfigurationProperties(prefix = DataSourceAutoConfiguration.CONFIGURATION_PREFIX)
    @Bean
    public DataSource dataSource() {
        DataSourceBuilder factory = DataSourceBuilder
                .create(this.properties.getClassLoader())
                .driverClassName(this.properties.getDriverClassName())
                .url(this.properties.getUrl())
                .username(this.properties.getUsername())
                .password(this.properties.getPassword());
        return factory.build();
    }
    

    The DataSourceBuilder is responsible for figuring out which pooling library to use, by checking for each of a series of know classes on the classpath. It then constructs the DataSource and returns it to the dataSource() function.

    At this point, magic kicks in using @ConfigurationProperties. This annotation tells Spring to look for properties with prefix CONFIGURATION_PREFIX (which is spring.datasource). For each property that starts with that prefix, Spring will try to call the setter on the DataSource with that property.

    The Tomcat DataSource is an extension of DataSourceProxy, which has the method setMaxActive().

    And that's how your spring.datasource.maxActive=5 gets applied correctly!

    What about other connection pools

    I haven't tried, but if you are using one of the other Spring-Boot supported connection pools (currently HikariCP or Commons DBCP) you should be able to set the properties the same way, but you'll need to look at the project documentation to know what is available.