Запрос, @Запрос, @NamedQuery : производительность SpringBoot и JPA

#spring #spring-boot #jpa #spring-data-jpa #spring-data

Вопрос:

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

  1. Программный класс javax.persistence.Query
  2. Аннотация javax.persistence.NamedQuery
  3. Аннотация 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, поэтому я ожидаю, что у вас не так много возможностей для оптимизации