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/...

Комментарии • 29

  • @andreyguzik2675
    @andreyguzik2675 4 года назад +9

    Жду конца сезона чтоб все сразу посмотреть))

  • @andriiostashevskyi3465
    @andriiostashevskyi3465 4 года назад +1

    какой же ти красавчик!!!! спасибо так держать.. лайк и подписка

  • @Игорь-б5ц2ъ
    @Игорь-б5ц2ъ 4 года назад +3

    С возвращением в строй!

  • @EvilCartman
    @EvilCartman 3 года назад +1

    Лови палец вверх, дружище. =)
    Столкнулся с этой проблемой, и сразу вспомнил, что у тебя был про это видос.
    Опять выручаешь, цены тебе нет.

  • @kurmasasha
    @kurmasasha 4 года назад +1

    Это шикарно

  • @user-zb3gr6vi8w
    @user-zb3gr6vi8w 4 года назад

    Спасибо за этот плейлист, узнал много нового. Может потому, что не смотрел ещё сарафан)

  • @renniqs1084
    @renniqs1084 4 года назад +1

    N+1, круто!!

  • @dmitrysomsin2117
    @dmitrysomsin2117 4 года назад

    Спасибо за урок! Жду продолжения.

  • @romanmotovilov129
    @romanmotovilov129 3 года назад

    Не устаю вам ставить лайки под видео и как всегда, жду новые видосики. Андрей - жду от вас свежатинки, ведь вся годнота только на этом канале!))) Ну очень хочется что-то новенькое!!!

  • @ShaddTM00
    @ShaddTM00 2 года назад +1

    Мало, очень мало про N + 1 и абсолютно ничего про работу Entity Graph

  • @Togruls
    @Togruls 4 года назад +1

    Cделай пожалуйста про много-параметырный поиск в Spring. Искал вроде советуют сделать по Querydsl. Может есть вариант лучше? Почему нельзя сделать составной кастомный квери и если field not null то канкатинировать его к квери.

  • @mihailbogatyurev8664
    @mihailbogatyurev8664 4 года назад +1

    Спасибо большое за видео! У меня вопрос, в случае аннотации @JsonIgnore для метода getRepr() в доменной сущности Model.java не потеряем ли мы функционал из dialogPage.js по обновлению родительской таблицы после изменения принадлежности машины? Если я правильно понял, при окрытии модального окна мы будем обращаться к объектам как к классу Model и getRepr() не отработает и мы получим пустую строку вместо обновления таблицы. Еще раз большое спасибо за ваши уроки)

  • @turumpurum9374
    @turumpurum9374 4 года назад +2

    Эх, когда же продолжение? Заждалась(

  • @drhardyc
    @drhardyc 4 года назад +2

    Спасибо за твои видосы!!! Планируется в данном цикле видео с авторизацией?

    • @letsCodeDru
      @letsCodeDru  4 года назад

      Да, планируется. Спасибо за поддержку канала :) очень уважаю твои усы спонсора))

    • @drhardyc
      @drhardyc 4 года назад +1

      @@letsCodeDru надеюсь в будущем у меня будет возможность поддержать твой проект ещё больше. Успехов и положительных эмоций тебе в твое деле!

    • @letsCodeDru
      @letsCodeDru  4 года назад

      Пасиб)

  • @KyivanEnjoyer
    @KyivanEnjoyer 4 года назад +1

    Вопрос по пагинации, мне говорил умный дядька, что стандартная пагинация плохая, типа там используется offset(а это типа плохо), а надо nextPageToken использовать для загрузки страниц. То-есть надо делать свою реализацию пагинации. Еще сказал, что нужно использовать Sequence для стратегии id, а еще индексы создавать в базе данных. Мог бы ты показать как это делать?:) Потому что я вообще не понял как это реализовывается. Было бы круто, если бы ты добавил миграцию(это правда, что без нее нигде не делают таблицы? типа отдавать хибернейту создание таблиц - очень плохо).
    А так как обычно - большое спасибо)

    • @letsCodeDru
      @letsCodeDru  4 года назад

      В целом дядька все верно сказал. Но тут мы просто вкатываемся в тему. Этот плейлист и так не особо смотрят, а если я ещё и жестить начну, то вообще полтора человека будут смотреть

    • @KyivanEnjoyer
      @KyivanEnjoyer 4 года назад

      @@letsCodeDru а вдруг не смотрят, потому что видят, что какие-то нонейм технологии, а не условно Spring Boot 2 + Postgres + ReactJS + Redux и прям жестить на уровне продакшена с архитектурой и прочим прочим:) Я уверен этот курс бы взлетел просто в топы ютуба по программированию, так как все курсы по спрингу на всяких онлайн курсах это сраное гавно, которое даже на 10% не похоже на реальность как по функционалу, так и по чистоте кода. Я вот пересматриваю сарафан(хоть там и Vue, который я не хочу учить, так как учу React иногда), а вот этот я даже не знаю нужно ли мне вникать, когда и так много технологий в моем списке изучаемых:)

  • @ivsergey5150
    @ivsergey5150 4 года назад

    Андрей, скажите пожалуйста, как вы относитесь к паттернам проектирования? применяет ли где? какие использовали в своих проектах? И советуете ли задумываться о них и стараться применять их.

    • @letsCodeDru
      @letsCodeDru  4 года назад +2

      Надо знать их как термины и уметь их видеть. А натягивать на код их не нужно. Паттерны - это словарь, не больше

    • @gennadyshevchenko7940
      @gennadyshevchenko7940 Год назад

      вы еще про алгоритмы его спросите)))

    • @gennadyshevchenko7940
      @gennadyshevchenko7940 Год назад

      @@letsCodeDru еще можно отвечать "Я их не знаю, но интуитивно применяю".

  • @MegaDjango13
    @MegaDjango13 4 года назад

    А как на счет варнинга от пагинации firstResult/maxResults specified with collection fetch; applying in memory! Если это не решить то на проде могут быть проблемы. vladmihalcea.com/fix-hibernate-hhh000104-entity-fetch-pagination-warning-message/
    Не сделаешь урок по этой теме?
    Все таки проблема не менее распространенная чем сама пагинация.

  • @JazZ6386
    @JazZ6386 2 года назад

    Spring 2.6.0 так и не смог победить n+1 :(

  • @gennadyshevchenko7940
    @gennadyshevchenko7940 Год назад

    Ох уж эти кодеры, которые не учили математику в школе и транслируют свое невежество в массы. Правильно N + 1, и только так.