it-swarm.com.de

Spring-Boot: Wie lege ich die JDBC-Pool-Eigenschaften für die maximale Anzahl von Verbindungen fest?

Spring-Boot ist ein ziemlich tolles Tool, aber die Dokumentation ist etwas spärlich, wenn es um eine erweiterte Konfiguration geht. Wie kann ich Eigenschaften wie die maximale Größe für meinen Datenbankverbindungspool festlegen?

Spring-Boot unterstützt Tomcat-jdbc, HikariCP und Commons DBCP nativ. Sind sie alle gleich konfiguriert?

55
JBCP

Es stellt sich heraus, dass das Festlegen dieser Konfigurationseigenschaften ziemlich unkompliziert ist, aber die offizielle Dokumentation ist allgemeiner, so dass es bei der Suche speziell nach Verbindungs-Konfigurationsinformationen möglicherweise schwer zu finden ist. 

Um die maximale Poolgröße für Tomcat-jdbc festzulegen, legen Sie diese Eigenschaft in Ihrer .properties- oder .yml-Datei fest:

spring.datasource.maxActive=5

Sie können auch Folgendes verwenden, wenn Sie es vorziehen:

spring.datasource.max-active=5

Sie können jede gewünschte Verbindungspooleigenschaft auf diese Weise festlegen. Hier ist eine vollständige Liste der Eigenschaften, die von Tomcat-jdbc unterstützt werden.

Um zu verstehen, wie dies allgemeiner funktioniert, müssen Sie etwas in den Spring-Boot-Code einsteigen.

Spring-Boot baut die DataSource folgendermaßen auf ( siehe hier , Zeile 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();
}

Der DataSourceBuilder ist dafür verantwortlich, herauszufinden, welche Pooling-Bibliothek verwendet werden soll, indem er nach einer Reihe von Wissensklassen im Klassenpfad sucht. Dann erstellt sie die DataSource und gibt sie an die Funktion dataSource() zurück.

An diesem Punkt tritt Magic in @ConfigurationProperties ein. Diese Anmerkung weist Spring an, nach Eigenschaften mit dem Präfix CONFIGURATION_PREFIX (das ist spring.datasource) zu suchen. Spring versucht für jede Eigenschaft, die mit diesem Präfix beginnt, den Setter für die DataSource mit dieser Eigenschaft aufzurufen.

Die Tomcat DataSource ist eine Erweiterung von DataSourceProxy , die die Methode setMaxActive() hat.

Und so wird Ihr spring.datasource.maxActive=5 richtig angewendet!

Was ist mit anderen Verbindungspools?

Ich habe es nicht versucht, aber wenn Sie einen der anderen von Spring-Boot unterstützten Verbindungspools (derzeit HikariCP oder Commons DBCP) verwenden, sollten Sie die Eigenschaften auf dieselbe Weise festlegen können, aber Sie müssen sich das Projekt ansehen Dokumentation, um zu wissen, was verfügbar ist.

107
JBCP

Bei der aktuellen Version von Spring-Boot (1.4.1.RELEASE) hat jede Implementierung der Pooling-Datenquelle ein eigenes Präfix für Eigenschaften.

Wenn Sie beispielsweise Tomcat-jdbc verwenden:

spring.datasource.Tomcat.max-wait=10000

Die Erklärung finden Sie hier

spring.datasource.max-wait=10000

das hat keine Auswirkung mehr.

29
Daniel Nuss

Unterschiedliche Verbindungspools haben unterschiedliche Konfigurationen.

Zum Beispiel erwartet Tomcat (Standard):

spring.datasource.ourdb.url=...

und HikariCP wird zufrieden sein mit:

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

Wir können beides ohne Boilerplate-Konfiguration erfüllen:

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

Es gibt keine Eigenschaft zum Definieren eines Verbindungspoolanbieters.

Werfen Sie einen Blick auf source DataSourceBuilder.Java

Wenn sich Tomcat, HikariCP oder Commons DBCP im Klassenpfad befinden, wird einer von ihnen ausgewählt (in dieser Reihenfolge zuerst bei Tomcat).

... so können wir den Verbindungspoolanbieter mit dieser Maven-Konfiguration (pom.xml) problemlos ersetzen:

    <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>
5
wildloop

In Spring Boot 2.x müssen Sie auf Providerspezifische Eigenschaften verweisen.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-nach-produktionsdatenbank

Der Standardwert für hikari kann mit spring.datasource.hikari.maximum-pool-size festgelegt werden.

2
Mariano LEANCE

Basierend auf Ihrem Anwendungstyp/Größe/Last/Nr. von Anwendern ..etc - u kann als Produktionsmerkmale folgen 

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
0
Pravin