#spring #spring-boot #jpa #spring-data-jpa #spring-data
Вопрос:
Я пытаюсь оптимизировать время отклика конечной точки. Я столкнулся с вопросом, следует ли мне приложить усилия для рефакторинга кода, чтобы увидеть, как работают три разных подхода:
- Программный класс
javax.persistence.Query
- Аннотация
javax.persistence.NamedQuery
- Аннотация
org.springframework.data.jpa.repository.Query
Как бы то ни было, мы используем Spring’s @Query
. И объем рефакторинга, который необходимо выполнить, делает так, что я предпочел бы получить некоторые теоретические знания, прежде чем углубляться в это.
Каковы преимущества и недостатки использования каждого из этих трех вариантов?
Наш стек: Postgres, EclipseLink и SpringBoot.
Ответ №1:
В javax.persistence.NamedQuery
аннотации просто предлагается способ задания запросов в классе сущностей, а не, например, как часть интерфейсов spring-data-репозитория ( org.springframework.data.jpa.repository.Query
). Поскольку различается только расположение определения запроса, между двумя вариантами не должно быть большой разницы в производительности.
javax.persistence.Query
Интерфейс используется реализациями JPA внутренне, поэтому, опять же, не так много производительности можно получить, используя его явно в собственном коде каким-либо образом.
Прежде чем углубляться в это направление, при оптимизации времени отклика сначала следует оценить следующие моменты:
- скорость запросов в базе данных (правильно ли используются индексы?)
- количество запросов, выполняемых ORM (например, чтобы избежать n 1 проблем, указав разумное поведение выборки с помощью
@EntityGraph
s)
Комментарии:
1. Я уже исследовал и исправил упомянутые предложения. Я нахожусь на последнем этапе, пытаясь выжать максимум из возможностей приложения. Мой ход мыслей был примерно таким: «возможно, есть какая-то повторяющаяся работа, которую необходимо выполнять всякий
Query
раз, когда используется a, и что результат может быть где-то сохранен, только если использовать правильную точку входа». Один из примеров, который я имел в виду, — это параметризованная строка SQL: может быть, она кэшируется и связана с каждым запросом во время инициализации или пересчитывается при каждом вызове?2. хорошо, я вижу, что кэширование операторов-это то, о чем обычно заботится драйвер jdbc, поэтому я ожидаю, что у вас не так много возможностей для оптимизации