Почему возникают проблемы с производительностью при возврате JSON с RestController в Spring для 4 МБ - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть приложение, которое использует Spring Boot + JPA / Hibernate (используется БД PostGresDB).У меня есть метод Controller, который возвращает обратно JSONArray.Размер массива достиг 3,4 МБ.Я заметил, что при получении этого JSONArray клиенту требуется 30-35 секунд для выполнения своего запроса.Я проверил запрос, который генерируется, и этот запрос сам завершается за 500 мс, так что БД на самом деле не является проблемой.Я думаю, ~ 4 МБ данных это слишком много?У меня не так много опыта, поэтому мне было интересно, если это займет так много времени.Это веб-сервис, который работает в AWS на компьютере со стеком.

Любые шаги по устранению неполадок или понимание отладки или очевидные вещи, которые я должен делать.Я изучил постраничный ответ, но хотел бы избежать этого, если это возможно.Не думал, что 3.4MB будет таким большим.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Как формируется информация на бэкэнде? Участвуют ли JOINs / несколько таблиц? Попробуйте отправить 4 МБ статических данных в качестве теста и посмотрите, как это происходит? (Для этого может потребоваться создать поддельную конечную точку REST, но если вы сможете получить JSON, то сможете сохранить его в файле или чем-то еще).

Вы также можете разместить таймеры в своем коде или использовать инструмент, такой как JVisualVM, для подключения к работающему процессу и сбора информации о синхронизации метода. Здесь может быть полезно посмотреть на метрику «метод собственного времени», если проблема заключается в вашем Java-коде или его зависимостях времени выполнения.

0 голосов
/ 12 апреля 2019

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

@RequestMapping("api")
public SomeObject getSomeObject() {
    long start = System.currentTimeMillis();

    // call the method that gets the object via JPA

    System.out.println("Got all results in '" + (System.currentTimeMillis() - start) / 1000 + "' seconds");
}

Если результат, который он выводит, составляет> 30 секунд, то вы знаете, что hibernate является вашим узким местом.Если это так, то вам нужно выполнить некоторую нумерацию страниц, чтобы ограничить результаты, которые вы возвращаете клиенту.

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