Spring-Boot: Jak ustawić właściwości puli JDBC, takie jak maksymalna liczba połączeń?

81

Spring-Boot to całkiem niesamowite narzędzie, ale dokumentacja jest nieco skąpa, jeśli chodzi o bardziej zaawansowaną konfigurację. Jak ustawić właściwości, takie jak maksymalny rozmiar puli połączeń z bazą danych?

Wiosna-Boot podpory tomcat-jdbc, HikariCPa Commons DBCPnatywnie są one skonfigurowane w ten sam sposób?

JBCP
źródło
Uważam, że lepiej, używając innego dostawcy DataSource, takiego jak BoneCP lub C3P0
Luiggi Mendoza
3
-Dspring.datasource.tomcat.initial-size=10(domyślnie 10)
Christophe Roussy

Odpowiedzi:

122

Okazuje się, że ustawienie tych właściwości konfiguracyjnych jest dość proste, ale oficjalna dokumentacja jest bardziej ogólna, więc może być trudna do znalezienia podczas wyszukiwania informacji o konfiguracji puli połączeń.

Aby ustawić maksymalny rozmiar puli dla tomcat-jdbc, ustaw tę właściwość w pliku .properties lub .yml:

spring.datasource.maxActive=5

Jeśli wolisz, możesz również skorzystać z:

spring.datasource.max-active=5

W ten sposób możesz ustawić dowolną właściwość puli połączeń. Oto pełna lista właściwości obsługiwanych przeztomcat-jdbc .

Aby ogólnie zrozumieć, jak to działa, musisz trochę zagłębić się w kod Spring-Boot.

Spring-Boot konstruuje źródło danych w następujący sposób ( zobacz tutaj , wiersz 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 jest odpowiedzialny za ustalenie, której biblioteki puli należy użyć, sprawdzając każdą z serii znanych klas w ścieżce klas. Następnie konstruuje DataSource i zwraca go do dataSource()funkcji.

W tym momencie pojawia się magia @ConfigurationProperties. Ta adnotacja mówi Springowi, aby szukał właściwości z przedrostkiem CONFIGURATION_PREFIX(którym jest spring.datasource). Dla każdej właściwości, która zaczyna się od tego prefiksu, Spring spróbuje wywołać metodę ustawiającą w DataSource z tą właściwością.

Tomcat DataSource jest rozszerzeniem DataSourceProxy , które ma tę metodę setMaxActive().

I w ten sposób twój spring.datasource.maxActive=5jest poprawnie stosowany!

A co z innymi pulami połączeń

Nie próbowałem, ale jeśli używasz jednej z innych pul połączeń obsługiwanych przez Spring-Boot (obecnie HikariCP lub Commons DBCP), powinieneś być w stanie ustawić właściwości w ten sam sposób, ale musisz spojrzeć na projekt dokumentację, aby wiedzieć, co jest dostępne.

JBCP
źródło
6
Jest to wyraźny dokumentacja na jednym (jak to się dzieje): docs.spring.io/spring-boot/docs/current/reference/htmlsingle/... . Możesz także uruchomić aplikację i spojrzeć na / configprops (z Actuatorem). Problem z dokumentacją polega na tym, że wszystkie implementacje DataSource mają nieco inne właściwości (po prostu tworzysz powiązanie z komponentem bean Java).
Dave Syer
Dzięki za zwrócenie uwagi na to @DaveSyer, nie jest to zbyt przyjazne dla SEO podczas wyszukiwania słów kluczowych związanych z pulą połączeń. Zgadzam się z różnicą, że pule połączeń mają różne konfiguracje, dlatego dodałem sekcję na ten temat. Zaktualizuję odpowiedź.
JBCP,
8
Zobacz inne odpowiedzi, takie jak Daniel's i Wildloop's. Począwszy od późniejszych wersji rozruchowych wiosennych, wiele ustawień wymaga skonfigurowania ustawień specyficznych dla dostawcy. np . spring.datasource.tomcat.max-activelub spring.datasource.hikari.maximum-pool-size.
Dan Tanner,
W moim przypadku spring.datasource.maxActive=1działało tylko . Ta linia spring.datasource.max-active=1nie działa dla mnie. Wersja Spring Boot2.2.2.RELEASE
Rafael
32

W aktualnej wersji Spring-Boot (1.4.1.RELEASE) każda implementacja buforowania źródła danych ma swój własny prefiks właściwości.

Na przykład, jeśli używasz tomcat-jdbc:

spring.datasource.tomcat.max-wait=10000

Możesz znaleźć wyjaśnienie tutaj

spring.datasource.max-wait=10000

to już nie ma wpływu.

Daniel Nuss
źródło
6

Różne pule połączeń mają różne konfiguracje.

Na przykład Tomcat (domyślnie) oczekuje:

spring.datasource.ourdb.url=...

a HikariCP będzie zadowolony z:

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

Możemy zaspokoić oba bez konfiguracji standardowej:

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

Brak właściwości do zdefiniowania dostawcy puli połączeń.

Spójrz na źródło DataSourceBuilder.java

Jeśli Tomcat, HikariCP lub Commons DBCP znajdują się na ścieżce klas, jeden z nich zostanie wybrany (w tej kolejności najpierw z Tomcat).

... więc możemy łatwo zastąpić dostawcę puli połączeń za pomocą tej konfiguracji 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>
kinjelom
źródło
3

Na podstawie typu / rozmiaru / obciążenia / liczby aplikacji. użytkowników ... itd. - możesz śledzić swoje właściwości produkcyjne

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
Pravin
źródło
Dodanie spring.datasource.tomcat.max-active=5 spring.datasource.tomcat.max-idle=5mi wystarczyło, dzięki!
L.Butz