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


80

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

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


我发现使用其他数据源提供程序(例如BoneCP或C3P0)会更好
Luiggi Mendoza

3
-Dspring.datasource.tomcat.initial-size=10(默认值为10)
Christophe Roussy

Answers:


121

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

要设置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的数据源是的延伸DataSourceProxy,其具有方法setMaxActive()

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

那其他连接池呢

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


5
一个明确的文档(发生):docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。您也可以启动应用程序并查看/ configprops(使用Actuator)。文档的问题在于所有DataSource实现的属性都略有不同(您只是绑定到Java Bean)。
Dave Syer 2014年

感谢您指出@DaveSyer,它在搜索与连接池相关的关键字时不是非常SEO友好。我同意不同的连接池具有不同的配置,这就是为什么我在此添加了一节。我将更新答案。
JBCP

7
查看其他答案,例如Daniel和Wildloop。从更高版本的春季启动版本开始,许多设置要求您设置提供程序特定的设置。例如spring.datasource.tomcat.max-activespring.datasource.hikari.maximum-pool-size
Dan Tanner

就我而言,这只spring.datasource.maxActive=1起作用。这条线spring.datasource.max-active=1对我不起作用。春季靴子版本2.2.2.RELEASE
拉斐尔

32

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

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

spring.datasource.tomcat.max-wait=10000

你可以在这里找到解释

spring.datasource.max-wait=10000

这不再起作用了。



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>

2

根据您的应用程序类型/大小/负载/编号。用户..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对我来说足够了,谢谢!
L.Butz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.