![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| dementiev |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.2.2008 Где: Минск Репутация: 1 Всего: 1 |
делаю пагинацию, включён кэш 2го уровня. Через хибер работает нормально, через jpa же работает в пару раз медленнее.
Проблемы: 1) работает гораздо медленнее, чем через хибер+критерию 2) запрос кэшируется, т.е. новые запросы берутся из кэша. В хибере тоже стоит кэш, но там он срабатывает, если я беру ту страницу, которую уже брал. В jpa же он всегда срабатывает(не пойму откуда у него уже есть запрос с такими параметрами!) буду рад ответам). Под параметрами я подразумеваю startNumber и numberToRetrieve. Отключил эту строку:
теперь запросы не кэшируются, но работает гораздо медленнее, чем через хибер + критерию. |
||||
|
|||||
| dementiev |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.2.2008 Где: Минск Репутация: 1 Всего: 1 |
суть ошибки кратко:
jpa тянет сразу все данные, несмотря на
Поменял left join на inner join - стало работать быстрее, т.к. берётся меньше объектов. Но, почему в хибере ограничения для пагинации срабатывают, а в jpa нет? |
|||
|
||||
| dementiev |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.2.2008 Где: Минск Репутация: 1 Всего: 1 |
переделал через jpa+criteria - стало работать быстрее, чем через hibernate+criteria. Единственный минус - 100ая страница(на каждой по 100 записей) берётся около 2х секунд, первые 10 страниц - около 0 секунд.
Облазил весь гугль, так и не понял, почему jpa+hql сразу брало все записи в память, несмотря на
|
||||
|
|||||
| Restavrator |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.6.2007 Репутация: 1 Всего: 1 |
Для точного ответа надо смотреть конкретную реализацию, но думаю дело в следующем (по крайне мере для 1 примера): Запрос использует join для "подтягивания" данных по схеме one-to-many Т.к. пагинация делается для корневого класа, то в этом случае простого ограничения на выбор строк в запросе недостаточно. Поэтому JPA делает пагинацию в памяти. А хибернейт делает ограничение по выбираемым строкам, но количество корневых объектов не всегда будет равно размеру страницы. Хибернейт в более старой версии тоже использовал в таком случае пагинацию в памяти, но потом поменял подход. |
|||
|
||||
| dementiev |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.2.2008 Где: Минск Репутация: 1 Всего: 1 |
Restavrator, я так и понял, но нигде не нашёл доказательств этому. Спасибо за объяснение.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |