2012-03-06 8 views
2

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

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

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

время чтения JDBC (session.doWork) : 23 сек
Читать время Hibernate (session.createQuery с ленивым выборки): 94 s

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

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

ответ

4

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

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

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

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

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

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

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

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

  • убедитесь бассейном вашего подключения настроен правильно

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

  • рассмотреть хранимые процедуры, они, как правило, гораздо быстрее

+0

Спасибо за быстрый ответ, но швы, что мы испробовали все, что и теперь мы застряли с этим 4x накладных расходов. – mario

+0

@mario: Вы пробовали профилировать? Но, честно говоря, 23 секунды в сыром JDBC означает, что вы делаете * много запросов, не ожидайте, что Hibernate будет сравнимо быстрее со всеми издержками отражения/HQL (может быть, API критериев или [пакетная обработка] (http: // docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html)) Также Hibernate не самый быстрый поставщик JPA: http://www.jpab.org –

+0

Мы читаем много данных, но с несколькими запросами. Мой инстинкт говорит мне, что ожидается 2-5 раз над головой, и наши достижения (4x) соответствуют ожиданиям. Я проверю jpab (пока не слышал об этом). Благодаря! – mario

Смежные вопросы