Артём Гордиенко - Hibernate - проблема декартова произведения при запросах с пагинацией
HTML-код
- Опубликовано: 25 авг 2024
- Ближайшая конференция - Joker 2024, 9 октября (Online), 15-16 октября (Санкт-Петербург + трансляция).
Подробности и билеты: jrg.su/Ypf1HW
- -
Часто мы сталкиваемся с проблемой декартова произведения при использовании Hibernate, иногда даже не замечая этого. Особенно явно эта проблема проявляет себя при запросах с пагинацией.
В своем докладе Артём рассмотрит следующие вопросы:
- Когда можно столкнуться с этой проблемой?
- Как с виду очевидное решение не всегда оказывается самым производительным?
- Вы уже перешли на Hibernate 6? А вот вам баг, который обнаружил спикер при подготовке этого доклада. Обсудим причину его возникновения и связь с темой доклада.
- Варианты решения проблемы декартова произведения: плюсы и минусы.
Презентация к докладу: squidex.jugru....
Спасибо за интересный доклад! мы в своё время тоже столкнулись с этой проблемой пагинации в памяти приложения. Мало кто в принципе знает об этой проблеме
Спасибо! Рад, что вам было интересно.
Спасибо Артему! BatchSize классная в данном случае штука! Но как я понял, она имеет преимущество над вторым подходом в случае, когда дочерних объектов слишком много (10-20-больше). Если пара-тройка, то они оба хороши
Она имеет преимущество из-за 2-х запросов к бд, что занимает значительное время. Плюс риски дисконекта увеличиваются
Если в связанных коллекциях содержится небольшое количество объектов и у вас всего несколько коллекций @OneToMany, то значительной разницы вы не заметите.
взглянем на ситуацию шире: молодой чемодан взял абстракцию в виде языка котлин, взял абстракцию под SQL в виде хибернета, взял абстракцию в виде мэпстракта.
И при использовании абстракций над абстрацией через абстракцию он обнаружил, что есть проблемы, которые надо решать. Нормальная ли это ситуация?
1. Спасибо за доклад. Тоже рою jpa.
2. На 12 минуте понял к чему ты клонишь, если бы ты использовал List, а не Set, то получил бы исключение, загуглив которое, ты нашел бы статью от Влада Михалсеа. Где он пишет, что Set не решает проблему, а под капотом будет декартово произведение.
3. Я написал самописный динамический ентити граф, через дерево и сабграфы. Интересно попробовать его вместе с батч сайзом, написаным в ручную через цикл по айдишникам.
Спасибо за доклад! Интересно что уже не в первый раз встречаю мнение о том что нативный запрос "написанный ручками" или вью как-то решают описанные в докладе проблемы с декартовым произведением. По сути дела те же самые джоины уйдут в нативный запрос или во вью, а декартово произведение никуда не денется + к этому ещё нужно будет как-то прикрутить пагинацию! К сожалению это осознаётся только когда непосредственно столкнёшься с реализацией...
Query DSL/jpa streamer в помощь
Был очень удивлен, что не было слов про query dsl или jpa streamer. Человек посмотрит и ришит, буду использовать batchsize, минусы которого очевидны. Или два запроса к бд, что тоже очень странно в наше время. В любом случае доклад - это большое дело, но ожидания совсем неоправдали себя(
Мне было бы интересно узнать, как Query DSL или JPA Streamer решают проблему декартова произведения в запросах с пагинацией. Если у вас есть примеры рабочего кода, например, на GitHub, я бы с удовольствием ознакомился с ними.
Зачем вообще хибер в микросервисах? На сколько там развестая модель предметной области у микросервиса? По итогу абстракция протекает везде где можно и нельзя... Столько упражнений, а по факту проще написать один не очень сложный запрос ручками и не страдать фигней.
или вьюху на стороне БД и проецировать это куда хочешь на стороне джава и делать старую добрую пагинацию из коробки. Как-то все сложно у автора
Query DSL/jpa streamer в помощь
Использовать или не использовать Hibernate зависит от вашей конкретной задачи и предпочтений. Для небольших микросервисов может быть вполне достаточно JdbcTemplate. Для микросервисов со сложной бизнес-логикой Hibernate позволяет быстро реализовывать необходимый функционал. Когда у вас динамические запросы с фильтрацией и сортировкой по десяти полям, это существенно ускоряет работу. С помощью абстракции вы не привязаны к конкретной базе данных. Также не всегда есть возможность выбора библиотек или фреймворков в существующих проектах. В данном докладе я рассматриваю проблемы, с которыми могут столкнуться разработчики (как я столкнулся), которые уже используют Hibernate в своих проектах или только планируют его использовать.
Потому что он идёт в зависимостях spring-data-jpa 😂
Мне тут кто-то рассказывал как все хорошо в джаве с проекциями из бд, где ты?)
Наверное просто не использует хибер)
Query DSL/jpa streamer в помощь
Изначально говорит, что ему надо выводить количество по счетам и прочую стату. А потом пишет код, чтоб вытягивать все из базы, вместо того, чтобы агрегаты использовать. Кек
Да, используйте нативный запрос, если запрос сложный. Какую-то фигню наковыряли и носятся с нею.
Нативный тежелее поддерживать, т.к. придется при необходимости "дебажить" строки, что не очень удобно. Query DSL/jpa streamer в помощь
Какой же он не компетентный. Не может даже нормально энтити граф использовать. А "замеры скорости" - это испанский стыд. Вопрос вообще некорректный изначально. Там рост m^n, а он все чешет про 2^n. Всегда можно будет подобрать m и n, чтобы его любимчик выиграл в миллион раз.
Хорошо хоть ему на это несколько раз указали потом