Oracle Connection Pooling mit Frühling

1. Übersicht

Oracle ist eine der beliebtesten Datenbanken in großen Produktionsumgebungen. Als Spring-Entwickler ist es daher sehr üblich, mit diesen Datenbanken arbeiten zu müssen.

In diesem Tutorial werden wir darüber sprechen, wie wir diese Integration vornehmen können.

2. Die Datenbank

Das erste, was wir brauchen, ist natürlich die Datenbank. Wenn wir keine installiert haben, können wir alle Datenbanken abrufen und installieren, die in den Oracle Database Software Downloads verfügbar sind. Falls wir jedoch keine Installation durchführen möchten, können wir auch Oracle-Datenbank-Images für Docker erstellen.

In diesem Fall verwenden wir ein Docker-Image der Standard Edition von Oracle Database 12c Release 2 (12.2.0.2) . Dies verhindert, dass wir neue Software auf unserem Computer installieren müssen.

3. Verbindungspooling

Jetzt haben wir die Datenbank für eingehende Verbindungen bereit. Als nächstes lernen wir einige verschiedene Methoden zum Zusammenführen von Verbindungspools im Frühjahr kennen.

3.1. HikariCP

Der einfachste Weg zum Verbindungspooling mit Spring ist die automatische Konfiguration. Die Spring-Boot-Starter-JDBC- Abhängigkeit enthält HikariCP als bevorzugte Pooling-Datenquelle. Wenn wir uns also unsere pom.xml ansehen, werden wir sehen:

 org.springframework.boot spring-boot-starter-data-jpa 

Die Spring-Boot-Starter-Daten-JPA- Abhängigkeit umfasst die Spring-Boot-Starter-JDBC- Abhängigkeit transitiv für uns.

Jetzt müssen wir nur noch unsere Konfiguration in die Datei application.properties einfügen:

# OracleDB connection settings spring.datasource.url=jdbc:oracle:thin:@//localhost:11521/ORCLPDB1 spring.datasource.username=books spring.datasource.password=books spring.datasource.driver-class-name=oracle.jdbc.OracleDriver # HikariCP settings spring.datasource.hikari.minimumIdle=5 spring.datasource.hikari.maximumPoolSize=20 spring.datasource.hikari.idleTimeout=30000 spring.datasource.hikari.maxLifetime=2000000 spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.poolName=HikariPoolBooks # JPA settings spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect spring.jpa.hibernate.use-new-id-generator-mappings=false spring.jpa.hibernate.ddl-auto=create

Wie Sie sehen können, haben wir drei verschiedene Konfigurationseinstellungen für den Abschnitt:

  • Im Abschnitt OracleDB-Verbindungseinstellungen haben wir die JDBC-Verbindungseigenschaften wie immer konfiguriert
  • Im Abschnitt HikariCP-Einstellungen konfigurieren wir das HikariCP-Verbindungspooling. Falls wir eine erweiterte Konfiguration benötigen, sollten wir die Liste der HikariCP-Konfigurationseigenschaften überprüfen
  • Der Abschnitt JPA-Einstellungen enthält einige grundlegende Konfigurationen für die Verwendung von Hibernate

Das ist alles was wir brauchen. Es könnte nicht einfacher sein, oder?

3.2. Tomcat und Commons DBCP2-Verbindungspooling

Spring empfiehlt HikariCP für seine Leistung. Andererseits unterstützt es auch Tomcat und Commons DBCP2 in automatisch konfigurierten Spring Boot-Anwendungen.

Es wird versucht, das HikariCP zu verwenden. Wenn es nicht verfügbar ist, wird versucht, das Tomcat-Pooling zu verwenden. Wenn keines davon verfügbar ist, wird versucht, Commons DBCP2 zu verwenden.

Wir können auch den zu verwendenden Verbindungspool angeben. In diesem Fall müssen wir unserer Datei application.properties lediglich eine neue Eigenschaft hinzufügen :

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Wenn wir bestimmte Einstellungen konfigurieren müssen, stehen deren Präfixe zur Verfügung:

  • spring.datasource.hikari. * für die HikariCP-Konfiguration
  • spring.datasource.tomcat. * für die Tomcat-Pooling-Konfiguration
  • spring.datasource.dbcp2. * für die Commons DBC2-Konfiguration

Und tatsächlich können wir den Frühling einstellen . datasource.type zu einer anderen DataSource- Implementierung. Es ist nicht notwendig, einer der drei oben genannten zu sein.

In diesem Fall haben wir jedoch nur eine sofort einsatzbereite Grundkonfiguration. Es wird viele Fälle geben, in denen wir einige erweiterte Konfigurationen benötigen. Lassen Sie uns einige von ihnen sehen.

3.3. Oracle Universal Connection Pooling

Wenn wir erweiterte Konfigurationen verwenden möchten, müssen wir die DataSource- Bean explizit definieren und die Eigenschaften festlegen . Der wahrscheinlich einfachste Weg, dies zu tun, ist die Verwendung der Annotationen @Configuration und @Bean .

Der Oracle Universal Connection Pool (UCP) für JDBC bietet eine voll funktionsfähige Implementierung zum Zwischenspeichern von JDBC-Verbindungen. Die Verbindungen werden wiederverwendet, anstatt neue zu erstellen. Es gibt uns auch eine Reihe von Eigenschaften zum Anpassen des Poolverhaltens.

Wenn wir UCP verwenden möchten, müssen wir die folgenden Maven-Abhängigkeiten hinzufügen:

 com.oracle.database.jdbc ojdbc8   com.oracle.database.ha ons   com.oracle.database.jdbc ucp 

Jetzt können wir den UCP-Verbindungspool deklarieren und konfigurieren:

@Configuration @Profile("oracle-ucp") public class OracleUCPConfiguration { @Bean public DataSource dataSource() throws SQLException { PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource(); dataSource.setUser("books"); dataSource.setPassword("books"); dataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); dataSource.setFastConnectionFailoverEnabled(true); dataSource.setInitialPoolSize(5); dataSource.setMinPoolSize(5); dataSource.setMaxPoolSize(10); return dataSource; } }

Im obigen Beispiel haben wir einige Pooleigenschaften angepasst:

  • setInitialPoolSize gibt die Anzahl der verfügbaren Verbindungen an, die nach dem Initiieren des Pools erstellt wurden
  • setMinPoolSize gibt die Mindestanzahl verfügbarer und ausgeliehener Verbindungen an, die unser Pool verwaltet, und
  • setMaxPoolSize gibt die maximale Anzahl verfügbarer und ausgeliehener Verbindungen an, die unser Pool verwaltet

Wenn wir weitere Konfigurationseigenschaften hinzufügen müssen, sollten wir das PoolDataSource JavaDoc oder das Entwicklerhandbuch überprüfen .

4. Ältere Oracle-Versionen

Für Versionen vor 11.2 wie Oracle 9i oder 10g sollten wir eine OracleDataSource erstellen, anstatt das Universal Connection Pooling von Oracle zu verwenden.

In unserer OracleDataSource- Instanz aktivieren wir das Verbindungs-Caching über setConnectionCachingEnabled :

@Configuration @Profile("oracle") public class OracleConfiguration { @Bean public DataSource dataSource() throws SQLException { OracleDataSource dataSource = new OracleDataSource(); dataSource.setUser("books"); dataSource.setPassword("books"); dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); dataSource.setFastConnectionFailoverEnabled(true); dataSource.setImplicitCachingEnabled(true); dataSource.setConnectionCachingEnabled(true); return dataSource; } }

Im obigen Beispiel haben wir die OracleDataSource für das Verbindungspooling erstellt und einige Parameter konfiguriert. Wir können alle konfigurierbaren Parameter auf dem überprüfen OracleDataSource JavaDoc.

5. Schlussfolgerung

Heutzutage ist die Konfiguration des Oracle-Datenbankverbindungspools mit Spring ein Kinderspiel.

Wir haben gesehen, wie es nur mit Autokonfiguration und programmgesteuert gemacht wird. Obwohl Spring die Verwendung von HikariCP empfiehlt, stehen andere Optionen zur Verfügung. Wir sollten vorsichtig sein und die richtige Implementierung für unsere aktuellen Bedürfnisse auswählen.

Und wie immer finden Sie das vollständige Beispiel auf GitHub.