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

Posted

技术标签:

【中文标题】Spring-Boot:如何设置 JDBC 池属性,例如最大连接数?【英文标题】:Spring-Boot: How do I set JDBC pool properties like maximum number of connections? 【发布时间】:2014-10-23 17:54:41 【问题描述】:

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

Spring-Boot 原生支持tomcat-jdbcHikariCPCommons DBCP,它们的配置方式都一样吗?

【问题讨论】:

我发现使用不同的 DataSource 提供程序(如 BoneCP 或 C3P0)会更好 -Dspring.datasource.tomcat.initial-size=10(默认为 10) 【参考方案1】:

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

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

spring.datasource.maxActive=5

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

spring.datasource.max-active=5

您可以通过这种方式设置任何您想要的连接池属性。 Here is a complete list of properties supported by tomcat-jdbc.

要更广泛地了解其工作原理,您需要深入研究一下 Spring-Boot 代码。

Spring-Boot 像这样构造 DataSource(see here,第 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),您应该能够以相同的方式设置属性,但您需要查看在项目文档中了解可用的内容。

【讨论】:

那里明确的文档(碰巧):docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。您也可以启动应用程序并查看 /configprops(使用 Actuator)。文档的问题是所有 DataSource 实现的属性都略有不同(您只是绑定到一个 Java bean)。 感谢@DaveSyer 指出这一点,它在搜索连接池相关关键字时对 SEO 不太友好。我同意不同的连接池有不同的配置,这就是我添加一个部分的原因。我会更新答案。 查看 Daniel 和 wildloop 等其他答案。从更高版本的 Spring Boot 版本开始,许多设置都要求您设置特定于提供程序的设置。例如spring.datasource.tomcat.max-activespring.datasource.hikari.maximum-pool-size. 就我而言,只有spring.datasource.maxActive=1 有效。这条线spring.datasource.max-active=1 对我不起作用。 Spring Boot 版本2.2.2.RELEASE【参考方案2】:

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

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

spring.datasource.tomcat.max-wait=10000

你可以找到解释here

spring.datasource.max-wait=10000

这已经没有效果了。

【讨论】:

【参考方案3】:

在 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

【讨论】:

【参考方案4】:

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

例如 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>

【讨论】:

【参考方案5】:

根据您的应用程序类型/大小/负载/编号。的用户 ..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

【讨论】:

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

以上是关于Spring-Boot:如何设置 JDBC 池属性,例如最大连接数?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将锁定模式设置为在 Informix - JDBC - tomcat 连接池中等待吗?

JDBC连接池的testQuery/validationQuery设置

如何使用 Spring Boot 设置 Spring JDBC 连接池?

Tomcat/数据库设置 - JDBC 连接池

spring-boot中tomcat的默认连接池?

将 Spring-Boot 连接到 MySQL