Использование пулов соединений в Hibernate

Когда мы настраиваем связь с базой данных в Hibernate, мы подкладываем под приложение мину замедленного действия. Дело в том, что как и в случае в JDBC, открывает ровно одно соединение с базой данных и разрешает только одному объекту Session использовать его. Это прекрасно работает в тестовых примерах, где только одно соединение и требуется. Это будет работать в однопоточных программах, которые не смогут использовать больше одной Session в единицу времени, но это приведёт к проблемам в реальном многопоточном приложении.  В самом деле, если у вас web приложение, то скорее всего в нём будет несколько нитей, которые обслуживают запросы. Если речь идёт о ETL приложении, то наверняка данные, над которыми оно работает, будут разделены на блоки, которые будут перерабатывать несколько параллельных потоков. Даже настольные приложения сейчас имеют несколько потоков. А соединение то у нас с базой одно. И это проблема.

К счастью решение этой проблемы известно: пулы соединений с базой и Hibernate их отлично поддерживает. Я возьму пример управления сущностями в Hibernate и добавлю к нему два пула соединений. К сожалению поддержка DBCP в Hibernate не очень работоспособна и я не могу рекомендовать её использовать.

HikariCP

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

Подключение HikariCP и настройка его параметров осуществляется в файле конфигурации Hibernate:

Опция hibernate.connection.provider_class явно включает в Hibernate поддержку HikariCP. Опции начинающиеся на hibernate.hikari.* передаются непосредственно в HikariCP и настраивают его.

c3p0

Hibernate имеет встроенную первоклассную поддержку c3p0. Достаточно лишь положить необходимые библиотеки в classpath и задать любую опцию c3p0. Необходимых библиотек две: сам c3p0 и библиотека поддержки от hibernate.

Hibernate настраивается как обычно, параметры c3p0 передаются с префиксом hibernate.c3p0

Hibernate не анализирует содержимое параметров с префиксом hibernate.c3p0, но требует наличия по меньшей мере одного такого параметра для автоматического включения пула c3p0.

Код примера доступен на github.