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