Перейти к основному содержимому

Пул соединений Oracle с помощью Spring

· 5 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

Oracle — одна из самых популярных баз данных в крупных производственных средах. Поэтому разработчикам Spring очень часто приходится работать с этими базами данных.

В этом уроке мы поговорим о том, как мы можем сделать эту интеграцию.

2. База данных

Первое, что нам нужно, это, конечно же, база данных. Если у нас ее нет, мы можем получить и установить любую из баз данных, доступных на странице загрузки программного обеспечения для баз данных Oracle . Но если мы не хотим выполнять какую-либо установку, мы также можем собрать любой образ базы данных Oracle для Docker .

В этом случае мы собираемся использовать образ Docker Oracle Database 12c Release 2 (12.2.0.2) Standard Edition . Следовательно, это избавляет нас от необходимости устанавливать новое программное обеспечение на наш компьютер.

3. Объединение соединений

Теперь у нас есть база данных, готовая для входящих подключений. Далее давайте изучим несколько различных способов создания пула соединений в Spring.

3.1. HikariCP

Самый простой способ создания пула соединений с помощью Spring — использовать автоконфигурацию. Зависимость spring-boot-starter-jdbc включает HikariCP в качестве предпочтительного источника данных для пула. Поэтому, если мы заглянем в наш pom.xml , мы увидим:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Зависимость spring-boot-starter-data-jpa включает зависимость spring-boot-starter-jdbc транзитивно для нас.

Теперь нам нужно только добавить нашу конфигурацию в файл 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

Как видите, у нас есть три разных параметра конфигурации раздела:

  • В разделе настроек подключения к OracleDB мы, как всегда, настроили свойства подключения JDBC.
  • В разделе настроек HikariCP мы настраиваем пул соединений HikariCP. Если нам нужна расширенная конфигурация, мы должны проверить список свойств конфигурации HikariCP.
  • Раздел настроек JPA представляет собой некоторую базовую конфигурацию для использования Hibernate .

Это все, что нам нужно. Это не может быть проще, не так ли?

3.2. Пул соединений Tomcat и Commons DBCP2

Spring рекомендует HikariCP за его производительность . С другой стороны, он также поддерживает Tomcat и Commons DBCP2 в автоконфигурируемых приложениях Spring Boot.

Он пытается использовать HikariCP. Если он недоступен, то пытается использовать пул Tomcat. Если ни один из них недоступен, он пытается использовать Commons DBCP2.

Мы также можем указать пул соединений для использования. В этом случае нам просто нужно добавить новое свойство в наш файл application.properties :

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

Если нам нужно настроить определенные параметры, у нас есть их префиксы:

  • spring.datasource.hikari.* для конфигурации HikariCP
  • spring.datasource.tomcat.* для конфигурации пула Tomcat
  • spring.datasource.dbcp2.* для конфигурации Commons DBC2

И, собственно, мы можем установить весну. datasource.type для любой другой реализации DataSource . Не обязательно быть одним из трех упомянутых выше.

Но в этом случае у нас будет просто базовая готовая конфигурация. Будет много случаев, когда нам потребуются некоторые расширенные конфигурации. Давайте посмотрим на некоторые из них.

3.3. Универсальный пул соединений Oracle

Если мы хотим использовать расширенные конфигурации, мы можем объявить источник данных UCP и установить остальные свойства в файле application.properties. Начиная с версии 21.1.0.0 UCP, это самый простой способ сделать это.

Универсальный пул соединений Oracle (UCP) для JDBC обеспечивает полнофункциональную реализацию для кэширования соединений JDBC. Он повторно использует соединения вместо создания новых. Это также дает нам набор свойств для настройки поведения пула.

Если мы хотим использовать UCP, нам нужно добавить следующие зависимости Maven:

<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.ha</groupId>
<artifactId>ons</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ucp</artifactId>
</dependency>

Теперь нам нужно только добавить нашу конфигурацию в файл application.properties :

# UCP settings
spring.datasource.type=oracle.oracleucp.jdbc.UCPDataSource
spring.datasource.oracleucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource
spring.datasource.oracleucp.sql-for-validate-connection=select * from dual
spring.datasource.oracleucp.connection-pool-name=UcpPoolBooks
spring.datasource.oracleucp.initial-pool-size=5
spring.datasource.oracleucp.min-pool-size=5
spring.datasource.oracleucp.max-pool-size=10

В приведенном выше примере мы настроили некоторые свойства пула:

  • spring.datasource.oracleucp.initial-pool-size указывает количество доступных подключений, созданных после запуска пула.
  • spring.datasource.oracleucp.min-pool-size указывает минимальное количество доступных и заимствованных соединений, которые поддерживает наш пул, и
  • spring.datasource.oracleucp.max-pool-size указывает максимальное количество доступных и заимствованных соединений, которые поддерживает наш пул.

Если нам нужно добавить дополнительные свойства конфигурации, мы должны проверить UCPDataSource JavaDoc или руководство разработчика .

4. Старые версии Oracle

Для версий до 11.2, таких как Oracle 9i или 10g , мы должны создать OracleDataSource вместо использования Oracle Universal Connection Pooling.

В нашем экземпляре OracleDataSource мы включаем кэширование соединения через 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;
}
}

В приведенном выше примере мы создавали OracleDataSource для пула соединений и настраивали некоторые параметры. Мы можем проверить все настраиваемые параметры в OracleDataSource JavaDoc .

5. Вывод

В настоящее время настройка пула соединений с базой данных Oracle с использованием Spring не составляет труда.

Мы видели, как это сделать, просто используя автоконфигурацию и программно. Несмотря на то, что Spring рекомендует использовать HikariCP, доступны и другие варианты. Мы должны быть осторожны и выбирать правильную реализацию для наших текущих нужд.

И, как всегда, полный пример можно найти на GitHub .