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

JBC*_*BCP 67 java spring jdbc spring-boot tomcat-jdbc

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

Spring的引导支持tomcat-jdbc,HikariCP以及Commons DBCP原生的它们都配置了相同的方式吗?

JBC*_*BCP 114

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

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

spring.datasource.maxActive=5
Run Code Online (Sandbox Code Playgroud)

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

spring.datasource.max-active=5
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式设置任何连接池属性.以下是支持的完整属性列表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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tomcat的数据源是的延伸DataSourceProxy,其具有方法setMaxActive().

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

那么其他连接池呢?

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

  • 那里有*明确的文档(正好相反):http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#appendix.您也可以启动应用程序并查看/ configprops(使用Actuator).文档的问题是所有DataSource实现都具有稍微不同的属性(您只是绑定到Java bean). (5认同)
  • 查看其他答案,如Daniel's和wildloop's.从以后的春季启动版本开始,许多设置都要求您设置提供程序特定的设置.例如`spring.datasource.tomcat.max-active`或`spring.datasource.hikari.maximum-pool-size`. (5认同)

Dan*_*uss 31

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

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

spring.datasource.tomcat.max-wait=10000
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到解释

spring.datasource.max-wait=10000
Run Code Online (Sandbox Code Playgroud)

这已经不再有效了.


Mar*_*NCE 10

在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


wil*_*oop 6

不同的连接池具有不同的配置.

例如,Tomcat(默认)期望:

spring.datasource.ourdb.url=...
Run Code Online (Sandbox Code Playgroud)

和HikariCP将很满意:

spring.datasource.ourdb.jdbc-url=...
Run Code Online (Sandbox Code Playgroud)

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

spring.datasource.ourdb.jdbc-url=${spring.datasource.ourdb.url}
Run Code Online (Sandbox Code Playgroud)

没有属性来定义连接池提供程序.

看看源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>
Run Code Online (Sandbox Code Playgroud)


小智 5

基于您的应用程序类型/大小/负载/数量。用户..等 - 您可以继续关注您的生产属性

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
Run Code Online (Sandbox Code Playgroud)