Как правильно кэшировать данные в весенней загрузке приложения с Thymleaf - PullRequest
0 голосов
/ 14 февраля 2020

Я пишу код Java для моего загрузочного приложения Spring, чтобы получить список из 40000 элементов и через Thymeleaf опубликовать его в раскрывающемся поле. Однако я заметил, что когда я загружаю данные и go в выпадающий список, все идет медленно.

Мне сказали кэшировать значения и сохранять их. Хотя я не слишком знаком с этим процессом, я попытался использовать аннотацию @Cacheable для моего SpringBootApplication, но он все еще не работал. Я пытаюсь понять, что я сделал не так или есть лучший способ решения этой проблемы.

Уровень обслуживания:

@SuppressWarnings("unchecked")
@Cacheable("String")
public List<String> getServerListing(){
    StoredProcedureQuery storedProcedure = entityManager.createStoredProcedureQuery("GetAllServers");
    return storedProcedure.getResultList();

}

Сначала у меня есть хранимая процедура вниз все данные с сервера, (~ 40 000 записей).

Контроллер:

List<String> servers = joinQueryService.getServerListing();

modelAndView.addObject("servers", servers);

Затем я устанавливаю его в список строк и отправляю его во внешний интерфейс.

Thymeleaf:

<div class="row">
    <div class="col col-lg-9 search-bar">
        <div class="form-group">
            <label>Server:</label> <select class="js-example-basic-single3"
                th:field="*{servers}" id="selectData3">
                <option value=""></option>
                <option th:each="servers : ${servers}" th:value="${servers}" th:text="${servers}" />
            </select>

        </div>
    </div>
</div>

SpringBoot:

@SpringBootApplication
@Cacheable
public class TaddmDevApplication {

    public static void main(String[] args) {

        Policy.setPolicy(new TaddmPolicy());

        SpringApplication.run(TaddmDevApplication.class, args);
    }

}

1 Ответ

1 голос
/ 15 февраля 2020

Я думаю, что проблема в следующем: браузеру потребуется несколько секунд для загрузки и / или отображения такого большого раскрывающегося списка, независимо от того, насколько упорядочено остальное ваше приложение.

В качестве теста, Я создал текстовый файл, не содержащий ничего, кроме раскрывающегося списка из 40 000 элементов (test.htm):

<!DOCTYPE html>
<html>
<body>
<h2>Create a drop-down List</h2>

<label for="widgets">Choose a widget:</label>

<select id="widgets">
  <option value="widget1">Widget 1</option>
  <option value="widget2">Widget 2</option>
  <option value="widget3">Widget 3</option>
  <option value="widget4">Widget 4</option>
  <option value="widget5">Widget 5</option>
  <option value="widget6">Widget 6</option>
  <option value="widget7">Widget 7</option>
  ... snipped for brevity!
  <option value="widget39998">Widget 39998</option>
  <option value="widget39999">Widget 39999</option>
  <option value="widget40000">Widget 40000</option>
</select>

</body>
</html>

Затем я открыл этот файл в Chrome и записал время обработки:

big select list in browser

Это заняло около 5 секунд. Не было никакой выборки из базы данных; нет сетевого трафика; нет обработки на стороне сервера.

Я думаю, что нижняя строка такова: выпадающий список такого размера будет громоздким для пользователей, а также медленным для обработки в браузере .

Это означает, что ваш вопрос становится другим: как отправить более скромный объем данных в браузер и позволить пользователю перемещаться по результатам каждой загрузки, по одной странице за раз. Я полностью согласен с вашей целью "миллисекунды", а не секунды, кстати. Это совершенно верно. Может быть, у вас уже есть, но попробуйте иметь в виду конкретную цель c («менее 300 мс» или что-то подобное).

Конечно, в вашем коде вполне могут быть оптимизации - но они, вероятно, на данный момент спорны.

Возможно, не тот ответ, который вы хотели, но я надеюсь, что это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...