Spring-Boot: Làm cách nào để đặt các thuộc tính nhóm JDBC như số lượng kết nối tối đa?


81

Spring-Boot là một công cụ khá tuyệt vời, nhưng tài liệu hơi thưa thớt khi nói đến cấu hình nâng cao hơn. Làm cách nào để đặt các thuộc tính như kích thước tối đa cho nhóm kết nối cơ sở dữ liệu của tôi?

Spring-Boot hỗ trợ tomcat-jdbc, HikariCPCommons DBCPnguyên bản là tất cả chúng đều được cấu hình theo cùng một cách?


Tôi tìm thấy tốt hơn sử dụng một nhà cung cấp khác nhau như DataSource BoneCP hoặc C3P0
Luiggi Mendoza

3
-Dspring.datasource.tomcat.initial-size=10(mặc định là 10)
Christophe Roussy

Câu trả lời:


121

Hóa ra việc thiết lập các thuộc tính cấu hình này khá đơn giản, nhưng tài liệu chính thức chung chung hơn nên có thể khó tìm thấy khi tìm kiếm cụ thể thông tin cấu hình nhóm kết nối.

Để đặt kích thước nhóm tối đa cho tomcat-jdbc, hãy đặt thuộc tính này trong tệp .properties hoặc .yml của bạn:

spring.datasource.maxActive=5

Bạn cũng có thể sử dụng những thứ sau nếu muốn:

spring.datasource.max-active=5

Bạn có thể đặt bất kỳ thuộc tính nhóm kết nối nào bạn muốn theo cách này. Đây là danh sách đầy đủ các thuộc tính được hỗ trợ bởitomcat-jdbc .

Để hiểu cách thức hoạt động tổng quát hơn, bạn cần tìm hiểu sâu về mã Spring-Boot một chút.

Spring-Boot xây dựng DataSource như thế này ( xem tại đây , dòng 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 chịu trách nhiệm tìm ra thư viện gộp nào sẽ sử dụng, bằng cách kiểm tra từng trong một loạt các lớp biết trên classpath. Sau đó, nó xây dựng DataSource và trả về dataSource()hàm.

Tại thời điểm này, phép thuật phát huy tác dụng @ConfigurationProperties. Chú thích này yêu cầu Spring tìm kiếm các thuộc tính có tiền tố CONFIGURATION_PREFIX(là spring.datasource). Đối với mỗi thuộc tính bắt đầu bằng tiền tố đó, Spring sẽ cố gắng gọi bộ thiết lập trên DataSource với thuộc tính đó.

Tomcat DataSource là một phần mở rộng của DataSourceProxy , có phương thức setMaxActive().

Và đó là cách bạn spring.datasource.maxActive=5được áp dụng chính xác!

Điều gì về các nhóm kết nối khác

Tôi chưa thử, nhưng nếu bạn đang sử dụng một trong các nhóm kết nối được hỗ trợ Spring-Boot khác (hiện tại là HikariCP hoặc Commons DBCP), bạn sẽ có thể đặt các thuộc tính theo cách tương tự, nhưng bạn sẽ cần xem xét dự án tài liệu để biết những gì có sẵn.


6
tài liệu hướng dẫn rõ ràng về một đó (khi nó xảy ra): docs.spring.io/spring-boot/docs/current/reference/htmlsingle/... . Ngoài ra, bạn có thể khởi động ứng dụng và xem / configprops (với Actuator). Vấn đề đối với tài liệu là tất cả các triển khai DataSource có các thuộc tính hơi khác nhau (bạn chỉ liên kết với một bean Java).
Dave Syer

Cảm ơn bạn đã chỉ ra điều này @DaveSyer, nó không thân thiện với SEO lắm khi tìm kiếm các từ khóa liên quan đến nhóm kết nối. Tôi đồng ý về sự khác biệt các nhóm kết nối có các cấu hình khác nhau, đó là lý do tại sao tôi đã thêm một phần trên đó. Tôi sẽ cập nhật câu trả lời.
JBCP

8
Xem các câu trả lời khác như của Daniel và wildloop. Kể từ các phiên bản khởi động mùa xuân sau này, nhiều cài đặt yêu cầu bạn đặt cài đặt dành riêng cho nhà cung cấp. ví dụ spring.datasource.tomcat.max-activehoặc spring.datasource.hikari.maximum-pool-size.
Dan Tanner

Đối với trường hợp của tôi chỉ spring.datasource.maxActive=1hoạt động. Dòng spring.datasource.max-active=1này không làm việc cho tôi. Phiên bản khởi động mùa xuân2.2.2.RELEASE
Rafael

32

Ở phiên bản hiện tại của Spring-Boot (1.4.1.RELEASE), mỗi triển khai nguồn dữ liệu gộp có tiền tố riêng cho các thuộc tính.

Ví dụ: nếu bạn đang sử dụng tomcat-jdbc:

spring.datasource.tomcat.max-wait=10000

Bạn có thể tìm thấy lời giải thích ở đây

spring.datasource.max-wait=10000

điều này không có hiệu lực nữa.



6

Các nhóm kết nối khác nhau có cấu hình khác nhau.

Ví dụ Tomcat (mặc định) mong đợi:

spring.datasource.ourdb.url=...

và HikariCP sẽ hài lòng với:

spring.datasource.ourdb.jdbc-url=...

Chúng tôi có thể đáp ứng cả hai mà không cần cấu hình boilerplate:

spring.datasource.ourdb.jdbc-url=${spring.datasource.ourdb.url}

Không có thuộc tính để xác định nhà cung cấp nhóm kết nối.

Hãy xem nguồn DataSourceBuilder.java

Nếu Tomcat, HikariCP hoặc Commons DBCP nằm trên classpath, một trong số chúng sẽ được chọn (theo thứ tự đó với Tomcat trước).

... vì vậy, chúng tôi có thể dễ dàng thay thế nhà cung cấp nhóm kết nối bằng cách sử dụng cấu hình maven này (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>

3

Dựa trên loại ứng dụng / kích thước / tải / không của bạn. của người dùng .. vv - bạn có thể tiếp tục theo dõi làm thuộc tính sản xuất của bạn

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

Thêm spring.datasource.tomcat.max-active=5 spring.datasource.tomcat.max-idle=5là đủ cho tôi, cảm ơn!
L.Butz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.