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?
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!
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.
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.
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}
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>
In Spring Boot 2.x müssen Sie auf Providerspezifische Eigenschaften verweisen.
Der Standardwert für hikari kann mit spring.datasource.hikari.maximum-pool-size
festgelegt werden.
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