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

81

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

Frühlings-Boot unterstützt tomcat-jdbc, HikariCPund Commons DBCPnativ sind sie alle auf die gleiche Weise konfiguriert?

JBCP
quelle
Ich finde es besser, einen anderen DataSource-Anbieter wie BoneCP oder C3P0 zu verwenden
Luiggi Mendoza
3
-Dspring.datasource.tomcat.initial-size=10(Standard ist 10)
Christophe Roussy

Antworten:

121

Es stellt sich heraus, dass das Festlegen dieser Konfigurationseigenschaften ziemlich einfach ist, aber die offizielle Dokumentation ist allgemeiner, so dass es möglicherweise schwierig ist, sie zu finden, wenn Sie speziell nach Konfigurationsinformationen für den Verbindungspool suchen.

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 dies bevorzugen:

spring.datasource.max-active=5

Auf diese Weise können Sie jede gewünschte Verbindungspool-Eigenschaft festlegen. Hier finden Sie eine vollständige Liste der von unterstützten Funktionentomcat-jdbc .

Um zu verstehen, wie dies allgemeiner funktioniert, müssen Sie sich ein wenig mit dem Spring-Boot-Code befassen.

Spring-Boot erstellt die DataSource folgendermaßen ( 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 Poolbibliothek verwendet werden soll, indem er im Klassenpfad nach einer Reihe von bekannten Klassen sucht. Anschließend wird die DataSource erstellt und an die dataSource()Funktion zurückgegeben.

An diesem Punkt beginnt die Verwendung von Magie @ConfigurationProperties. Diese Anmerkung weist Spring an, nach Eigenschaften mit dem Präfix CONFIGURATION_PREFIX( dh) zu suchen spring.datasource. Für jede Eigenschaft, die mit diesem Präfix beginnt, versucht Spring, den Setter in der DataSource mit dieser Eigenschaft aufzurufen.

Die Tomcat DataSource ist eine Erweiterung von DataSourceProxy , die über die Methode verfügt setMaxActive().

Und so wird Ihr spring.datasource.maxActive=5richtig 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 die gleiche Weise festlegen können, aber Sie müssen sich das Projekt ansehen Dokumentation, um zu wissen, was verfügbar ist.

JBCP
quelle
6
Hierzu gibt es eine explizite Dokumentation (wie es passiert): docs.spring.io/spring-boot/docs/current/reference/htmlsingle/… . Sie können auch die App starten und sich / configprops (mit Actuator) ansehen. Das Problem bei der Dokumentation besteht darin, dass alle DataSource-Implementierungen leicht unterschiedliche Eigenschaften haben (Sie binden nur an eine Java-Bean).
Dave Syer
Vielen Dank, dass Sie auf @DaveSyer hingewiesen haben. Es ist nicht sehr SEO-freundlich, wenn Sie nach Keywords suchen, die mit dem Verbindungspool zusammenhängen. Ich stimme dem Unterschied zu, dass Verbindungspools unterschiedliche Konfigurationen haben. Deshalb habe ich einen Abschnitt dazu hinzugefügt. Ich werde die Antwort aktualisieren.
JBCP
8
Siehe andere Antworten wie Daniels und Wildloops. Ab späteren Spring Boot-Versionen müssen Sie für viele Einstellungen die anbieterspezifischen Einstellungen vornehmen. zB spring.datasource.tomcat.max-activeoder spring.datasource.hikari.maximum-pool-size.
Dan Tanner
Für meinen Fall hat nur spring.datasource.maxActive=1funktioniert. Diese Leitung spring.datasource.max-active=1hat bei mir nicht funktioniert. Spring Boot Version2.2.2.RELEASE
Rafael
32

In der aktuellen Version von Spring-Boot (1.4.1.RELEASE) hat jede Pooling-Datenquellenimplementierung 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

Dies hat keine Wirkung mehr.

Daniel Nuss
quelle
6

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 beide ohne Boilerplate-Konfiguration erfüllen:

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

Es gibt keine Eigenschaft zum Definieren des Verbindungspoolanbieters.

Schauen Sie sich die Quelle DataSourceBuilder.java an

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

... also können wir den Verbindungspoolanbieter mithilfe dieser Maven-Konfiguration (pom.xml) einfach 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>
Kinjelom
quelle
3

Basierend auf Ihrem Anwendungstyp / Größe / Last / Nr. von Benutzern ..etc - u kann weiterhin als Ihre Produktionseigenschaften 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
Pravin
quelle
Hinzufügen spring.datasource.tomcat.max-active=5 spring.datasource.tomcat.max-idle=5war genug für mich, danke!
L.Butz