Ответ
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: Чтобы соединения, которые уже отжили своё или просто засрались, вовремя отправились на хуй и не висели мёртвым грузом.
И главный совет, нахуй: Не тыкай параметры пальцем в небо. Включи метрики, посмотри под нагрузкой, сколько соединений реально нужно. Иначе получится как в той истории — максимализм хуйня, а потом плачешь над утопленной производительностью.