90

Spring-Boot 是一个非常棒的工具,但是当涉及到更高级的配置时,文档有点稀疏。如何设置数据库连接池的最大大小等属性?

Spring-Boot 支持tomcat-jdbcHikariCP并且Commons DBCP它们本身是否都以相同的方式配置?

4

5 回答 5

134

事实证明,设置这些配置属性非常简单,但官方文档更通用,因此在专门搜索连接池配置信息时可能很难找到。

要为 tomcat-jdbc 设置最大池大小,请在 .properties 或 .yml 文件中设置此属性:

spring.datasource.maxActive=5

如果您愿意,还可以使用以下内容:

spring.datasource.max-active=5

您可以通过这种方式设置任何您想要的连接池属性。以下是受支持的属性的完整列表tomcat-jdbc

要更普遍地理解这是如何工作的,您需要深入研究一下 Spring-Boot 代码。

Spring-Boot 像这样构造 DataSource(参见此处,第 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();
}

DataSourceBuilder 负责通过检查类路径上的一系列已知类中的每一个来确定要使用哪个池化库。然后它构造 DataSource 并将其返回给dataSource()函数。

在这一点上,魔术开始使用@ConfigurationProperties。这个注解告诉 Spring 寻找带有前缀CONFIGURATION_PREFIX(即spring.datasource)的属性。对于以该前缀开头的每个属性,Spring 将尝试使用该属性调用 DataSource 上的 setter。

Tomcat DataSource 是 DataSourceProxy 的扩展它具有方法setMaxActive()

这就是您spring.datasource.maxActive=5正确应用的方式!

其他连接池呢

我没有尝试过,但是如果您使用的是其他 Spring-Boot 支持的连接池之一(当前是 HikariCP 或 Commons DBCP),您应该能够以相同的方式设置属性,但您需要查看项目文档以了解可用的内容。

于 2014-08-29T17:12:24.137 回答
36

在当前版本的 Spring-Boot (1.4.1.RELEASE) 中,每个池数据源实现都有自己的属性前缀。

例如,如果您使用的是 tomcat-jdbc:

spring.datasource.tomcat.max-wait=10000

你可以在这里找到解释

spring.datasource.max-wait=10000

这已经没有效果了。

于 2016-10-13T01:07:48.703 回答
24

在 Spring Boot 2.x 中,您需要引用提供者特定的属性。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database

默认情况下,hikari 可以使用spring.datasource.hikari.maximum-pool-size.

于 2018-11-16T01:46:06.177 回答
6

不同的连接池有不同的配置。

例如 Tomcat(默认)期望:

spring.datasource.ourdb.url=...

HikariCP 会很高兴:

spring.datasource.ourdb.jdbc-url=...

我们可以在没有样板配置的情况下满足两者:

spring.datasource.ourdb.jdbc-url=${spring.datasource.ourdb.url}

没有定义连接池提供程序的属性。

看看源DataSourceBuilder.java

如果 Tomcat、HikariCP 或 Commons DBCP 在类路径中,将选择其中一个(按照 Tomcat 优先的顺序)。

...因此,我们可以使用此 Maven 配置(pom.xml)轻松替换连接池提供程序:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>       

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
于 2015-08-11T17:20:13.047 回答
4

根据您的应用程序类型/大小/负载/编号。的用户 ..etc - 您可以继续关注您的生产属性

spring.datasource.tomcat.initial-size=50
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=300
spring.datasource.tomcat.max-idle=150
spring.datasource.tomcat.min-idle=8
spring.datasource.tomcat.default-auto-commit=true
于 2019-01-23T19:06:36.357 回答