Как настроить пул соединений (Connection Pool) в Hibernate?

«Как настроить пул соединений (Connection Pool) в Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Hibernate не реализует пул соединений самостоятельно, а делегирует эту задачу внешним библиотекам. Настройка зависит от провайдера.

1. Выбор и зависимость провайдера (на примере HikariCP — стандарт в Spring Boot):

<!-- Maven: pom.xml -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

2. Настройка в application.properties (Spring Boot):

# Spring Boot автоматически использует HikariCP при его наличии в classpath
spring.datasource.hikari.connection-timeout=30000 # Таймаут получения соединения (мс)
spring.datasource.hikari.minimum-idle=5           # Минимальное количество простаивающих соединений
spring.datasource.hikari.maximum-pool-size=20     # Максимальный размер пула
spring.datasource.hikari.idle-timeout=600000      # Таймаут простаивания соединения (мс)
spring.datasource.hikari.max-lifetime=1800000     # Максимальное время жизни соединения (мс)

3. Настройка в hibernate.cfg.xml (чистый Hibernate):

<property name="hibernate.connection.provider_class">
    org.hibernate.hikaricp.internal.HikariCPConnectionProvider
</property>
<property name="hibernate.hikari.maximumPoolSize">20</property>
<property name="hibernate.hikari.dataSourceClassName">com.mysql.cj.jdbc.MysqlDataSource</property>
<property name="hibernate.hikari.dataSource.url">jdbc:mysql://localhost:3306/db</property>

Основные параметры для тюнинга:

  • maximum-pool-size: Главный параметр. Слишком большой пул может перегрузить БД, слишком маленький — вызвать нехватку соединений.
  • connection-timeout: Время ожидания свободного соединения. Если истёк — SQLTimeoutException.
  • idle-timeout и max-lifetime: Помогают очищать "устаревшие" соединения и переподключаться.

Best practice: Мониторьте метрики пула (активные/простаивающие соединения, время ожидания) под нагрузкой для точной настройки.