Spring-Boot:如何设置JDBC池属性,如最大连接数?

102

Spring-Boot是一个非常棒的工具,但在更高级的配置方面文档有些稀少。我该如何设置像数据库连接池最大大小这样的属性?

Spring-Boot本地支持tomcat-jdbcHikariCPCommons DBCP,它们的配置方式都相同吗?


我发现使用不同的DataSource提供程序,如BoneCP或C3P0更好。 - Luiggi Mendoza
4
-Dspring.datasource.tomcat.initial-size=10(默认值为10):这是一个Spring Boot应用程序中的配置参数,用于设置Tomcat连接池中初始化的连接数。默认值为10。 - Christophe Roussy
6个回答

138

原来设置这些配置属性是相当简单的,但官方文档比较通用,因此在专门搜索连接池配置信息时可能会很难找到。

要为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),则应该能够以相同的方式设置属性,但是您需要查看项目文档以了解可用的选项。


6
这个问题其实有明确的文件记录(碰巧),可以在此处查看:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#appendix。此外,您可以启动该应用程序并查看 /configprops(使用 Actuator)。但是,对于文档来说,所有 DataSource 实现都具有略微不同的属性(您只需绑定到一个 Java bean)。 - Dave Syer
感谢您指出这一点,@DaveSyer,在搜索连接池相关关键字时,它并不太友好。我同意连接池之间的差异有不同的配置,这就是为什么我添加了一个关于这个的部分。我会更新答案。 - JBCP
10
请查看像Daniel和wildloop这样的其他答案。在较新的Spring Boot版本中,许多设置需要您设置特定于提供程序的设置。例如:spring.datasource.tomcat.max-activespring.datasource.hikari.maximum-pool-size - Dan Tanner
对于我的情况,只有 spring.datasource.maxActive=1 起作用。这一行 spring.datasource.max-active=1 对我无效。Spring Boot 版本为 2.2.2.RELEASE - Rafael

37

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

例如,如果您正在使用tomcat-jdbc:

spring.datasource.tomcat.max-wait=10000
你可以在这里找到解释。
spring.datasource.max-wait=10000

这已经没有任何影响了。


30

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>

4
根据您的应用程序类型/大小/负载/用户数量等,您可以将以下内容作为生产属性:
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

添加 spring.datasource.tomcat.max-active=5 对我来说已经足够了,谢谢! - L.Butz

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接