Oracle Connection Pooling con Spring

1. Panoramica

Oracle è uno dei database più diffusi negli ambienti di produzione di grandi dimensioni. Quindi, come sviluppatori Spring, è molto comune lavorare con questi database.

In questo tutorial parleremo di come possiamo realizzare questa integrazione.

2. Il database

La prima cosa di cui abbiamo bisogno è, ovviamente, il database. Se non ne abbiamo uno installato, possiamo ottenere e installare uno qualsiasi dei database disponibili nei download del software Oracle Database. Ma nel caso in cui non vogliamo eseguire alcuna installazione, possiamo anche creare una qualsiasi delle immagini del database Oracle per Docker.

In questo caso, utilizzeremo un'immagine Docker di Oracle Database 12c Release 2 (12.2.0.2) Standard Edition. Di conseguenza, questo ci evita di dover installare nuovo software sul nostro computer.

3. Pool di connessioni

Ora abbiamo il database pronto per le connessioni in entrata. Successivamente, impariamo alcuni modi diversi per eseguire il pool di connessioni in primavera.

3.1. HikariCP

Il modo più semplice per il pool di connessioni con Spring è utilizzare l'autoconfigurazione. La dipendenza spring-boot-starter-jdbc include HikariCP come origine dati di pooling preferita. Pertanto, se diamo uno sguardo al nostro pom.xml vedremo:

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

La dipendenza spring-boot-starter-data-jpa include la dipendenza spring-boot-starter-jdbc in modo transitorio per noi.

Ora dobbiamo solo aggiungere la nostra configurazione nel file application.properties :

# 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

Come puoi vedere, abbiamo tre diverse impostazioni di configurazione della sezione:

  • La sezione delle impostazioni di connessione OracleDB è dove abbiamo configurato le proprietà di connessione JDBC come facciamo sempre
  • La sezione delle impostazioni di HikariCP è dove configuriamo il pool di connessioni HikariCP. Nel caso in cui abbiamo bisogno di una configurazione avanzata, dovremmo controllare l'elenco delle proprietà di configurazione di HikariCP
  • La sezione delle impostazioni JPA è una configurazione di base per l'utilizzo di Hibernate

Questo è tutto ciò di cui abbiamo bisogno. Non potrebbe essere più facile, vero?

3.2. Tomcat e Commons DBCP2 Connection Pooling

Spring consiglia HikariCP per le sue prestazioni. D'altra parte, supporta anche Tomcat e Commons DBCP2 nelle applicazioni autoconfigurate Spring Boot.

Cerca di utilizzare HikariCP. Se non è disponibile, prova a utilizzare il pool di Tomcat. Se nessuno di questi è disponibile, tenta di utilizzare Commons DBCP2.

Possiamo anche specificare il pool di connessioni da usare. In tal caso, dobbiamo solo aggiungere una nuova proprietà al nostro file application.properties :

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

Se dobbiamo configurare impostazioni specifiche, abbiamo a disposizione i loro prefissi:

  • spring.datasource.hikari. * per la configurazione HikariCP
  • spring.datasource.tomcat. * per la configurazione del pool di Tomcat
  • spring.datasource.dbcp2. * per la configurazione di Commons DBC2

E, in realtà, possiamo impostare la primavera. datasource.type a qualsiasi altra implementazione di DataSource . Non è necessario essere nessuno dei tre sopra menzionati.

Ma in tal caso, avremo solo una configurazione di base pronta all'uso. Ci saranno molti casi in cui avremo bisogno di alcune configurazioni avanzate. Vediamone alcuni.

3.3. Oracle Universal Connection Pooling

Se vogliamo utilizzare configurazioni avanzate, dobbiamo definire esplicitamente il bean DataSource e impostare le proprietà. Probabilmente il modo più semplice per farlo è quello di utilizzare i @Configuration e @Bean annotazioni.

Oracle Universal Connection Pool (UCP) per JDBC fornisce un'implementazione completa per la memorizzazione nella cache delle connessioni JDBC. Riutilizza le connessioni invece di crearne di nuove. Fornisce inoltre una serie di proprietà per personalizzare il comportamento del pool.

Se vogliamo utilizzare UCP, dobbiamo aggiungere le seguenti dipendenze Maven:

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

Ora siamo pronti per dichiarare e configurare il pool di connessioni UCP:

@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; } }

Nell'esempio sopra, abbiamo personalizzato alcune proprietà della piscina:

  • setInitialPoolSize specifica il numero di connessioni disponibili create dopo l'avvio del pool
  • setMinPoolSize specifica il numero minimo di connessioni disponibili e prese in prestito che il nostro pool sta mantenendo, e
  • setMaxPoolSize specifica il numero massimo di connessioni disponibili e prese in prestito che il nostro pool mantiene

Se dobbiamo aggiungere più proprietà di configurazione, dovremmo controllare il PoolDataSource JavaDoc o la guida dello sviluppatore.

4. Versioni Oracle precedenti

Per le versioni precedenti alla 11.2, come Oracle 9i o 10g , dovremmo creare un OracleDataSource invece di utilizzare Oracle Universal Connection Pooling.

Nella nostra istanza OracleDataSource , attiviamo il caching della connessione tramite 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; } }

Nell'esempio precedente, stavamo creando OracleDataSource per il pool di connessioni e configurato alcuni parametri. Possiamo controllare tutti i parametri configurabili su OracleDataSource JavaDoc.

5. conclusione

Al giorno d'oggi, la configurazione del pool di connessioni al database Oracle utilizzando Spring è un gioco da ragazzi.

Abbiamo visto come farlo usando solo l'autoconfigurazione e in modo programmatico. Anche se Spring consiglia l'uso di HikariCP, sono disponibili altre opzioni. Dobbiamo stare attenti e scegliere la giusta implementazione per le nostre esigenze attuali.

E, come sempre, l'esempio completo può essere trovato su GitHub.