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

Ответ

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: Мониторьте метрики пула (активные/простаивающие соединения, время ожидания) под нагрузкой для точной настройки.

Ответ 18+ 🔞

Смотри, тут такая история, блядь. Hibernate сам по себе — он как тот самый Герасим, немой и сильный, но в плане соединений к базе он нихуя не делает. Ну то есть совсем. Он эту работу, сука, на откуп отдаёт, сторонним библиотекам, как будто говорит: «На, мужик, разбирайся, а я тут ORM'ом страдать буду».

1. Выбираем провайдера (возьмём HikariCP — это сейчас как Муму, все его любят):

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

Вот эту хуйню в pom.xml суёшь, и Spring Boot, хитрая жопа, уже по запаху понимает, что ты хочешь.

2. Настройка в application.properties (для Spring Boot'овцев):

# Spring Boot, видя HikariCP, такой: "О, ебушки-воробушки, ща всё настрою!"
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 (для чистых аскетов, без Spring):

<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>

Тут уже прям в лоб говоришь Хибернейту: «Слушай сюда, дружок-пирожок, бери Hikari и не еби мозг».

На что смотреть, чтобы не обосраться:

  • maximum-pool-size: Это, блядь, святое. Сделаешь мало — все запросы в очередь встанут, как за колбасой в девяностые. Сделаешь много — база ляжет, как опьяневший мудак, и скажет «я больше не могу».
  • connection-timeout: Если все соединения заняты, сколько твой код будет тупо ждать, прежде чем плюнуть и выкинуть ошибку.
  • idle-timeout и max-lifetime: Чтобы соединения, которые уже отжили своё или просто засрались, вовремя отправились на хуй и не висели мёртвым грузом.

И главный совет, нахуй: Не тыкай параметры пальцем в небо. Включи метрики, посмотри под нагрузкой, сколько соединений реально нужно. Иначе получится как в той истории — максимализм хуйня, а потом плачешь над утопленной производительностью.