Повышение производительности извлечения с Hibernate - PullRequest
2 голосов
/ 06 марта 2012

Как вы все знаете, Hibernate вводит накладные расходы практически для всех операций с базой данных из-за управления внутренним кешем и состоянием объекта.

В настоящее время в нашем приложении есть то, что мы читаем данные с использованием простого SQL (JDBC) и использовать Hibernate для сохранения и обновления.Причина в том, что нам нужно загружать много информации при каждом запуске вычислений, но обновлять только ограниченную часть.

Теперь мы знаем, что этот подход не самый чистый, и мы провели несколько тестов, в которых мы пыталисьТонкая настройка чтения Hibernate, но мы достигли следующего:

Время чтения JDBC (session.doWork): 23 с
Время чтения Hibernate (session.createQuery с отложенной выборкой): 94 с

Нам кажется, что существующая служебная нагрузка связана с дополнительной обработкой Hibernate, и мы задались вопросом, может ли какое-либо помочь распараллеливание самого чтения (мы читаем много таблиц, которые мы могли бы выполнять параллельно)?Предназначены ли сеанс и транзакция Hibernate для безопасного использования из нескольких потоков?

Кроме того, если у вас есть какая-либо другая идея, что может помочь ускорить этот процесс, мы будем благодарны.

1 Ответ

4 голосов
/ 06 марта 2012

, если распараллеливание самого чтения могло бы помочь (мы читаем много таблиц, которые мы могли бы делать параллельно)?

Это зависит.Если ваша база данных кластеризована или разные таблицы находятся в разных табличных пространствах, расположенных на разных физических дисках или машинах, распараллеливание может ускорить процесс.В противном случае ввод-вывод является узким местом.

Также убедитесь, что ваши запросы скомпилированы один раз и используются повторно, фаза синтаксического анализа / компиляции на сервере базы данных может занять некоторое время (но на самом деле может быть успешно распараллелена, поскольку эта часть является ЦП-bound).

Разработаны ли сеанс и транзакция Hibernate для безопасного использования из нескольких потоков?

Абсолютно нет.Сеансы и транзакции в Hibernate по своей сути связаны с подключением к базе данных.И соединение однопоточное.

Кроме того, если у вас есть какая-либо другая идея, что может помочь ускорить этот процесс, мы будем благодарны.

  • использовать подготовленные операторы / скомпилированные запросы, чтобы избежать издержек компиляции в СУБД

  • эксперимент с L2 и кеш запросов в Hibernate

  • makeубедитесь, что ваш пул соединений настроен правильно

  • отслеживать активность GC и потребление памяти, возможно, ваш сеанс Hibernate становится слишком большим?

  • рассмотрите хранимые процедурыони имеют тенденцию быть намного быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...