← Назад к вопросам

Какой из Connection Pool будет использован во время запуска сервиса в Spring Boot Data JPA при наличии кастомного и стандартного Connection Pool?

2.0 Middle🔥 71 комментариев
#Spring Boot и Spring Data#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Connection Pool в Spring Boot Data JPA

При наличии нескольких Connection Pool реализаций в проекте Spring Boot использует чётко определённый порядок приоритета. Это важно для понимания, какой пул будет выбран.

Порядок приоритета Connection Pool

Spring Boot использует следующий порядок приоритета при выборе connection pool:

  1. HikariCP (по умолчанию и рекомендуется)
  2. Tomcat JDBC Pool
  3. Commons DBCP2
  4. Oracle UCP

Как Spring выбирает pool

Spring Boot использует механизм автоконфигурации. Если в classpath найдено несколько pooling библиотек, Spring выбирает первую доступную в порядке приоритета.

// application.yml (по умолчанию HikariCP)
spring:
  datasource:
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-timeout: 30000

HikariCP (по умолчанию)

HikariCP — это наиболее быстрый и лёгкий connection pool. Используется по умолчанию в Spring Boot 2.0+.

<!-- Maven dependency (включён в spring-boot-starter-data-jpa) -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

Конфигурация:

@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost/mydb");
        config.setUsername("user");
        config.setPassword("password");
        config.setMaximumPoolSize(10);
        config.setMinimumIdle(5);
        config.setConnectionTimeout(30000);
        return new HikariDataSource(config);
    }
}

Кастомный Connection Pool

Если нужно использовать собственный pool, можно:

Вариант 1: Отключить автоконфигурацию и явно определить DataSource

@Configuration
@ConditionalOnMissingBean(DataSource.class)
public class CustomPoolConfig {
    @Bean
    public DataSource dataSource() {
        // Кастомная реализация
        return new CustomConnectionPool().getDataSource();
    }
}

Вариант 2: Явно указать тип pool в spring.datasource.type

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource  # Явно HikariCP
    # или
    # type: org.apache.tomcat.jdbc.pool.DataSource  # Tomcat JDBC
    # или
    # type: org.apache.commons.dbcp2.BasicDataSource  # Commons DBCP2
    
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

Приоритет конфигурации

Когда в проекте присутствуют оба пула (например, HikariCP и Tomcat):

  1. Spring проверяет явное указание spring.datasource.type
  2. Если не указано, ищет beans в контексте
  3. Если несколько beans, использует первый найденный по приоритету
  4. Если явно определён @Bean с @Primary, используется он
@Configuration
public class DataSourceConfiguration {
    
    // Этот bean будет выбран (имеет @Primary)
    @Bean
    @Primary
    public DataSource hikariDataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost/db");
        config.setMaximumPoolSize(10);
        return new HikariDataSource(config);
    }
    
    // Этот bean будет проигнорирован для автоматического внедрения
    @Bean
    public DataSource tomcatDataSource() {
        org.apache.tomcat.jdbc.pool.DataSourceFactory factory = 
            new org.apache.tomcat.jdbc.pool.DataSourceFactory();
        // Конфигурация
        return null; // Конфигурация
    }
}

Практический пример

# application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=user
spring.datasource.password=password

# HikariCP настройки (используется по умолчанию)
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000

Сравнение популярных пулов

ПулСкоростьНадёжностьКонфигурацияИспользование
HikariCPОтличнаяОтличнаяПростаяПо умолчанию
Tomcat JDBCХорошаяХорошаяСредняяLegacy приложения
Commons DBCP2СредняяХорошаяСложнаяСтарые проекты
Oracle UCPХорошаяОтличнаяСредняяOracle БД

Как проверить, какой pool используется

@Component
public class DataSourceInfo {
    @Autowired
    private DataSource dataSource;
    
    @PostConstruct
    public void printDataSourceInfo() {
        System.out.println("DataSource class: " + dataSource.getClass().getName());
        // Вывод: com.zaxxer.hikari.HikariDataSource (если HikariCP)
    }
}

Отключение автоматического выбора pool

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Вывод: В Spring Boot по умолчанию используется HikariCP как самый быстрый и надёжный connection pool. Если в проекте одновременно присутствуют несколько пулов, Spring выбирает по приоритету (HikariCP > Tomcat > Commons DBCP2). Используйте @Primary или spring.datasource.type для явного управления выбором.