Весенняя загрузка RestController JSON сериализации стоила слишком много времени - PullRequest
0 голосов
/ 26 апреля 2019

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

@GetMapping(path = "/table")
    public Iterable<Obsidian> getReactTable(@RequestParam Long orderId) {
            long start = System.currentTimeMillis();
            ArrayList<Obsidian> results = new ArrayList<Obsidian>();
            for (Obsidian obs : obsidianRepo.findByOrder(order)) {
                results.add(obs);
            }
            long end = System.currentTimeMillis();
//  Only cost about 300ms
//          System.out.println(end - start);
            return results;
        }
    }

Всего в списке результатов около 500 экземпляров Obsidians.

Hibernate стоит всего 300 мс, а сериализация JSON (плюс nio и веб-передача) - стоитмне 30 секунд!

Что может заставить Джексона быть таким медленным?

Кстати: как я нашел это 30 секунд: я измеряю его в браузере ajax.

1 Ответ

1 голос
/ 26 апреля 2019

Краткий ответ: Джексон быстр.

Длинный ответ:

Должен сказать, извините, я допустил большую ошибку.Сериализация POJO не так проста, как я думал, она расширяет некоторый базовый класс сущностей, и сериализация базового класса делает что-то медленное в запросе к базе данных.

Если вы столкнетесь с вопросом, внимательно проверьте ваш POJO.

set show-sql = true поможет вам найти проблему.

Старая ошибка:

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

        long start = System.currentTimeMillis();
        ObjectMapper mapper  = new ObjectMapper();
        ArrayList<Obsidian> results = new ArrayList<Obsidian>();
        for (Obsidian obs : obsidianRepo.findByOrder(order)) {
            results.add(obs);
            mapper.writeValueAsString(obs);
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

Как вы можете видеть, я вручную вызываю jackson com.fasterxml.jackson.databind.ObjectMapper в цикле for, чтобы увидеть, сколько времени это стоит, и результат: 33247 мс, это именно то время, которое я измерил в браузере ajax.

@Test 
public void testJackson() throws JsonProcessingException {

    Obsidian obs = new Obsidian();
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValueAsString(obs);
}

Я также добавляю Test in JUnit Test, его стоимость составляет 0,070 с.

как сравнение Gson:

@Test 
public void testJackson() throws JsonProcessingException {
    Obsidian obs = new Obsidian();
    Gson gson = new Gson();
    gson.toJson(obs);
}

Gson стоит всего 0,018 с.(все еще слишком медленно)

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