Рубрики
Без рубрики

Повышение производительности серверной части Часть 1/3: Отложенная загрузка в приложениях Vaadin

Если у вас есть таблица или сетка данных, в которой, скажем, более нескольких сотен строк, вам следует использовать… С пометкой java, ваадин.

Если у вас есть таблица или сетка данных, в которой, скажем, более нескольких сотен строк, вам следует использовать отложенную загрузку. Это особенно верно в случае компонента Vaadin Grid , который позволяет очень легко отображать данные из массива или коллекции POJO. В этой статье я покажу вам, как легко использовать преимущества данных Spring Boot для простой реализации отложенной загрузки в приложениях Vaadin Flow. Вы можете найти видеоверсию этой темы, если хотите:

Понимание примера приложения

Давайте начнем с предыдущего приложения Vaadin Flow, которое я разработал с нуля в предыдущей статье . Короче говоря, у нас есть приложение Spring Boot , которое подключается к экземпляру MariaDB , используя Hibernate/JPA для чтения данных о книгах. Существует объект JPA под названием Книга , репозиторий Spring под названием Хранилище книг и класс обслуживания под названием Служба книг . Это обычная модель, которую вы можете встретить в отрасли. Веб-интерфейс пользователя (UI) реализован с помощью Потока Vaadin в классе под названием Просмотр книг .

Понимание проблемы, которую необходимо решить

Допустим, приложение находится в разработке уже некоторое время, и в базе данных насчитывается 50.000 книг. При таком довольно скромном количестве строк в таблице у нас может легко закончиться память с конфигурацией JVM по умолчанию приложения Spring Boot.

Если мы используем метод findAll() , чтобы получить все книги из базы данных и показать их в Сетка , каждый раз, когда запрашивается представление, в памяти сохраняется новая копия данных. С 50.000 книгами в примере приложения это означает, что как только в браузере откроются два представления (два пользователя или один пользователь с двумя вкладками, отображающими представление), мы получим сообщение об ошибке нехватки памяти. Даже если бы мы увеличили объем памяти JVM до миллионов байт, мы бы обнаружили, что загрузка книг занимает слишком много времени для хорошего пользовательского опыта.

Каждый раз, когда мы думаем, что таблица может содержать более, скажем, 100 строк, мы должны прекратить использовать метод findAll() и рассмотреть метод отложенной загрузки. Отложенная загрузка позволяет нам запрашивать только часть набора данных из базы данных. Экран редко сможет отображать 50.000 строк, поэтому загрузка всех 50.000 книг – пустая трата ресурсов, когда мы можем показать только несколько.

Исправление бэкэнда

В Spring Data метод findAll() перегружен версией, которая позволяет нам указывать фрагмент или “страницу” данных. JPA использует эту информацию для построения базового SQL-запроса с использованием предложений LIMIT и OFFSET. Вот изменения, которые нам нужны в классе обслуживания:

@Service
public class BookService {

    private final BookRepository repository;

    public BookService(BookRepository repository) {
        this.repository = repository;
    }

    public Stream findAll(int page, int pageSize) {
        return repository.findAll(PageRequest.of(page, pageSize)).stream();
    }

}

Крепление сетки

Компонент Сетка перегружает метод setItems() версией, которая позволяет нам передавать информацию со страницы Сетка это в настоящее время визуализируется в браузере в соответствии с положением полосы прокрутки. Изменение очень простое:

@Route("")
public class BooksView extends VerticalLayout {

    public BooksView(BookService service) {
        var grid = new Grid();
        ...

        grid.setItems(query ->
                service.findAll(query.getPage(), query.getPageSize()));

        ...
    }

}

Тестирование решения

С помощью этих простых изменений мы можем попробовать приложение и убедиться, что оно, безусловно, загружает данные намного быстрее и что мы можем открывать множество вкладок без сбоев приложения. Мы также могли бы включить вход в SQL-запрос, добавив следующее в файл application.properties :

spring.jpa.show-sql=true

Если мы прокрутим данные в браузере, мы должны увидеть запросы в журнале сервера.

Оригинал: “https://dev.to/alejandro_du/improving-backend-performance-part-1-3-lazy-loading-in-vaadin-apps-58la”