Hibernate занимает много времени, чтобы получить результат запроса - PullRequest
0 голосов
/ 10 января 2019

Всякий раз, когда я запрашиваю таблицу, позволяющую Spring Data / Hibernate создать запрос 'findByLabelAndUserId' в моем коде, это всегда кажется вечным.

Я проверяю запрос на сервере sql, и он мгновенно возвращает результат.

Когда я тестирую запрос в моем проекте, он тратит более 4 секунд, чтобы получить 10 строк.

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

Я пытался настроить это свойство в URL-адресе jdbc: sendStringParametersAsUnicode = false

Это сокращает время на 0,5 секунды, но этого недостаточно.

Это мой код: LeaveController:

@RequestMapping(value = "/leaves-management/leaves", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("hasAuthority('view_MY_LEAVE')")
public List<LeaveDto> getAllByUser(HttpServletRequest httpRequest) {
    String token = httpRequest.getHeader(tokenHeader);
    String username = jwtTokenUtil.getUsernameFromToken(token);
    User user = userService.findByUsername(username);
    List<Request> listRequests = requestService.findByLabelAndUserId(LabelRequest.LEAVE, user.getId());
    return listModelToListDtoWithStatus(listRequests);
}

раздел сущности:

public class Request extends AbstractAuditEntity {

    @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private LabelRequest label;

        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private Status status;

        @ManyToOne(fetch = FetchType.LAZY)
        private User user;
    }

Что можно сделать, чтобы сократить время на построение запроса с помощью данных / гибернации Spring.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Похоже на типичную проблему "левого соединения". Проверьте, какой эффективный запрос выполняется

0 голосов
/ 10 января 2019

Попробуйте добавить JPQL-запрос непосредственно в интерфейс пользователя. Таким образом, вы будете использовать этот запрос, а не тот, который будет генерировать весна.

@Query("SELECT r FROM Request r WHERE r.label = label AND r.user = user")
Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);

Если это не работает, попробуйте напрямую выполнить собственный запрос внутри интерфейса UserService.

@Query("SELECT r FROM Table_Request r WHERE r.Column_label = label AND r.Column_user = user",  nativeQuery = true)
Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);

Тем не менее, очень странно, почему весенние данные делают такой неэффективный запрос. Имейте в виду, если запрос настолько прост, проблема может быть где-то еще в вашем приложении.

Удачи!

...