N+1 и дефолтные методы. Spring Boot + Webix
HTML-код
- Опубликовано: 10 сен 2024
- Spring Boot MVC и Webix: решаем проблему N+1 через EntityGraph, настраиваем логгирование SQL и используем дефолтные методы в интерфейсах Java.
Поддержать проект:
➡ Стать спонсором www.youtube.co...
➡ Patreon / letscodedru
➡ Яндекс.Деньги money.yandex.r...
➡ PayPal paypal.me/lets...
➡ Qiwi qiwi.me/letscode
В прошлых видео мы реализовали списки и их редактирование через диалоговые окна. Но при этом остался недоделанный момент: автомобили у на отображаются только по модели и угадать марку текущего автомобиля не очень просто, глядя на него в списке.
Для решения этой проблемы мы используем дефолтную (default) реализацию методов в интерфейсах Java. Дефолтный метод позволяет добавить поведение, не требующее реализации у каждого из потомков, при этом не требующее дополнительного обслуживания и не создающее лишних зависимостей.
Далее мы сталкиваемся с проблемой N+1. Проблема эта выражается в том, что когда мы запрашиваем список сущностей, имеющих связи с другими сущностями, мы порождаем паразитные запросы. На каждый запрос списка основных сущностей мы получаем дополнительно столько запросов, сколько записей было получено в списке основной сущности. Данную проблему мы решаем с помощью известных нам EntityGraph.
Для того, чтобы проверить, что мы исключаем паразитные запросы, нам необходимо выводить SQL запросы в лог приложения. Spring поддерживает 2 переменных, для вывода запросов в лог приложения и для простого форматирования этих самых запросов:
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Код из видео:
github.com/dru...
Документация по Spring Data Entity Graph:
docs.spring.io...
Видео по приложению Сарафан, где используются сложные EntityGraph:
• Комментарии с JPA Enti...
Видео по приложению Сарафан, где настраивается JsonView:
• Подключаем базу данных...
Еще про Сарафан и JsonView:
• Сериализуем с JsonView...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Второй канал: / geekchatdru
➡ Twitch: / drucoder
➡ Твиттер: / letscodedru
➡ Группа Вконтакте: letscod...
➡ Канал в Telegram: t.me/letsCode_dru
➡ Чат в Telegram: t.me/joinchat/...
➡ Сервер в Discord: / discord
➡ Яндекс.Дзен: zen.yandex.ru/...
Жду конца сезона чтоб все сразу посмотреть))
какой же ти красавчик!!!! спасибо так держать.. лайк и подписка
С возвращением в строй!
Лови палец вверх, дружище. =)
Столкнулся с этой проблемой, и сразу вспомнил, что у тебя был про это видос.
Опять выручаешь, цены тебе нет.
Это шикарно
Спасибо за этот плейлист, узнал много нового. Может потому, что не смотрел ещё сарафан)
N+1, круто!!
Спасибо за урок! Жду продолжения.
Не устаю вам ставить лайки под видео и как всегда, жду новые видосики. Андрей - жду от вас свежатинки, ведь вся годнота только на этом канале!))) Ну очень хочется что-то новенькое!!!
Мало, очень мало про N + 1 и абсолютно ничего про работу Entity Graph
Cделай пожалуйста про много-параметырный поиск в Spring. Искал вроде советуют сделать по Querydsl. Может есть вариант лучше? Почему нельзя сделать составной кастомный квери и если field not null то канкатинировать его к квери.
Спасибо большое за видео! У меня вопрос, в случае аннотации @JsonIgnore для метода getRepr() в доменной сущности Model.java не потеряем ли мы функционал из dialogPage.js по обновлению родительской таблицы после изменения принадлежности машины? Если я правильно понял, при окрытии модального окна мы будем обращаться к объектам как к классу Model и getRepr() не отработает и мы получим пустую строку вместо обновления таблицы. Еще раз большое спасибо за ваши уроки)
так и есть)
Эх, когда же продолжение? Заждалась(
Скоро
Спасибо за твои видосы!!! Планируется в данном цикле видео с авторизацией?
Да, планируется. Спасибо за поддержку канала :) очень уважаю твои усы спонсора))
@@letsCodeDru надеюсь в будущем у меня будет возможность поддержать твой проект ещё больше. Успехов и положительных эмоций тебе в твое деле!
Пасиб)
Вопрос по пагинации, мне говорил умный дядька, что стандартная пагинация плохая, типа там используется offset(а это типа плохо), а надо nextPageToken использовать для загрузки страниц. То-есть надо делать свою реализацию пагинации. Еще сказал, что нужно использовать Sequence для стратегии id, а еще индексы создавать в базе данных. Мог бы ты показать как это делать?:) Потому что я вообще не понял как это реализовывается. Было бы круто, если бы ты добавил миграцию(это правда, что без нее нигде не делают таблицы? типа отдавать хибернейту создание таблиц - очень плохо).
А так как обычно - большое спасибо)
В целом дядька все верно сказал. Но тут мы просто вкатываемся в тему. Этот плейлист и так не особо смотрят, а если я ещё и жестить начну, то вообще полтора человека будут смотреть
@@letsCodeDru а вдруг не смотрят, потому что видят, что какие-то нонейм технологии, а не условно Spring Boot 2 + Postgres + ReactJS + Redux и прям жестить на уровне продакшена с архитектурой и прочим прочим:) Я уверен этот курс бы взлетел просто в топы ютуба по программированию, так как все курсы по спрингу на всяких онлайн курсах это сраное гавно, которое даже на 10% не похоже на реальность как по функционалу, так и по чистоте кода. Я вот пересматриваю сарафан(хоть там и Vue, который я не хочу учить, так как учу React иногда), а вот этот я даже не знаю нужно ли мне вникать, когда и так много технологий в моем списке изучаемых:)
Андрей, скажите пожалуйста, как вы относитесь к паттернам проектирования? применяет ли где? какие использовали в своих проектах? И советуете ли задумываться о них и стараться применять их.
Надо знать их как термины и уметь их видеть. А натягивать на код их не нужно. Паттерны - это словарь, не больше
вы еще про алгоритмы его спросите)))
@@letsCodeDru еще можно отвечать "Я их не знаю, но интуитивно применяю".
А как на счет варнинга от пагинации firstResult/maxResults specified with collection fetch; applying in memory! Если это не решить то на проде могут быть проблемы. vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/
Не сделаешь урок по этой теме?
Все таки проблема не менее распространенная чем сама пагинация.
Spring 2.6.0 так и не смог победить n+1 :(
Ох уж эти кодеры, которые не учили математику в школе и транслируют свое невежество в массы. Правильно N + 1, и только так.