簡體   English   中英

Spring-Boot:如何設置 JDBC 池屬性,例如最大連接數?

[英]Spring-Boot: How do I set JDBC pool properties like maximum number of connections?

Spring-Boot 是一個非常棒的工具,但是當涉及到更高級的配置時,文檔有點稀疏。 如何設置數據庫連接池的最大大小等屬性?

Spring-Boot 原生支持tomcat-jdbcHikariCPCommons DBCP它們是否都以相同的方式配置?

事實證明,設置這些配置屬性非常簡單,但官方文檔更通用,因此在專門搜索連接池配置信息時可能很難找到。

要為 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),您應該能夠以相同的方式設置屬性,但您需要查看項目文檔以了解可用的內容。

在當前版本的 Spring-Boot (1.4.1.RELEASE) 中,每個池數據源實現都有自己的屬性前綴。

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

spring.datasource.tomcat.max-wait=10000

你可以在這里找到解釋

spring.datasource.max-wait=10000

這已經沒有效果了。

在 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設置。

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

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

根據您的應用程序類型/大小/負載/編號。 的用戶 ..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

根據:

https://docs.spring.io/spring-boot/docs/1.1.2.RELEASE/reference/html/common-application-properties.html

spring.datasource.max-active=100 # Advanced configuration...
spring.datasource.max-idle=8
spring.datasource.min-idle=8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM