Подтвердить что ты не робот

Hibernate: Каков пул соединений и почему он по умолчанию не подходит для производства?

Я очень не знаком с Hibernate и только что начал работать над веб-приложением, которое использует его с базой данных MySQL. Я замечаю, что в учебном руководстве по документации сообщества указано:

Встроенный пул соединений Hibernate никоим образом не предназначен для использования в производстве. Он не имеет нескольких функций, найденных в любом приличном пуле подключений.

Может кто-нибудь это уточнить? Что именно не хватает и какие проблемы у людей с "дефолтным"? В googling я нашел сайт здесь, но на самом деле это не объясняет проблемы, а именно то, что вы должны использовать вместо этого.

4b9b3361

Ответ 1

Что такое пул соединений и почему он по умолчанию не подходит для производства? Может ли кто-то уточнить это?

Пул соединений - это метод открытия/подготовки/закрытия соединений. Механизм объединения соединений представляет собой часть программного обеспечения (компонента), которому вы делегируете функцию управления соединениями. Ваше приложение будет просто запрашивать подключение, использовать его и доставлять обратно в пул. Компонент отвечает за открытие N соединений и оставляет их готовыми, когда ваше приложение спрашивает. Если соединение устарело, механизм объединения затем закроет его и снова откроет новый. Это означает лучшее использование соединений, так как вам не нужно ждать, пока соединение будет установлено во время фактического выполнения вашего кода, и вам не нужно беспокоиться о устаревших соединениях.

Hibernate на самом деле не передает никаких реальных механизмов объединения пулов. Он обеспечивает внутренний менеджер соединений, который является очень рудиментарным. Причина проста: почти (если не все) серверы приложений (например, JBoss AS) и контейнеры сервлетов (например, Tomcat) по умолчанию используют механизм объединения пулов. Таким образом, вашему приложению не нужно беспокоиться о деталях об этом. Он просто запрашивает AS для подключения.

На мой взгляд, есть только два случая, когда вам нужно беспокоиться о пуле соединений:

  • Вы имеете дело с автономным приложением (которое не запускается внутри контейнера)
  • Вы действительно являетесь экспертом в пуле соединений и ни один из существующих не подходит для ваших нужд.

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

Ответ 2

Когда вы имеете дело с автономным приложением, есть несколько менеджеров объединения, которые не поддерживаются Hibernate. Hibernate никогда не одобрял одно явное. На протяжении многих лет многие приходят и исчезают снова. В конце концов, очень сложно судить, что это лучше всего. Хорошо проверять и сравнивать сами проекты и насколько они активны.

Ниже приведены некоторые недавние (2017) рекомендации по объединению отдельных приложений в алфавитном порядке:

C3P0 http://www.mchange.com/projects/c3p0/

Hikari https://github.com/brettwooldridge/HikariCP

Vibur http://www.vibur.org/

Ответ 3

Пул соединений по умолчанию в hibernate c3p0, названный в честь символа звездных войн. Но hibernate поддерживает также proxool и используется также для рекламы apache dbcp. Некоторое время DBCP был бездействующим и выпал из моды.

C3P0 фактически используется в производстве во многих проектах. Хотя иногда оказывается, что они плохо себя ведут в пиковое время. Существует несколько альтернатив. Как, например, новый пул соединений, включенный в Tomcat 7. Я еще не тестировал его, но слышал об этом несколько положительных отзывов.