Избегайте выбора JPA данных Spring перед сохранением объекта - PullRequest
1 голос
/ 20 июня 2019

Вот сценарий, я сохраняю сущность (назовем ее CG-сущностью), используя Spring Data JPA JpaRepository.В этой CG-сущности у нас так много сущностей One-One, One-Many и MM, и внутри этих сущностей существует больше связей и так далее.Я устанавливаю объект CG по его первичному ключу и добавляю к нему другие объекты.Таким образом, в основном этот объект CG CG должен использовать как FK для большинства других объектов внутри CG.

Некоторые из сущностей являются новыми, а другие устанавливаются путем создания объектов с заданным первичным идентификатором (поэтому нет необходимости использовать соответствующие хранилища, чтобы найти объект и установить его).В модельных классах все основные цвета устанавливаются вручную (без стратегий автоматической генерации) (я не могу представить структуры таблиц, поскольку мне не разрешено это делать). Когда я вызываю функцию .save (), JPA запускает эту функцию

    @Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

Отсюда Spring JPA проверяет, является ли CG новой сущностью, путем создания запросов на выборку.Когда я использую SQL-запрос, показанный в отладчике, я заметил, что он использует почти 70 запросов SELECT.В весенних документах Persistable я реализовал это и установил переопределение isNew() на false.Я сделал то же самое для тех объектов, где я создал PK.

Но когда я вызываю .save() для всей операции, данные пружины JPA перед вставкой выполняет почти 800 SELECT запросов, и существует 70 INSERT запросов (с запросами на вставку проблем нет).Требуется около 20 секунд, чтобы сохранить запись.Я ссылался на множество потоков, связанных с этим сценарием, и не смог найти хорошего решения SPRING DATA JPA.(SO Thread 1 ) Все, что мне нужно, это сократить время сохранения объекта CG.Есть ли у JPA данные о способах достижения этой цели?

1 Ответ

0 голосов
/ 05 июля 2019

Хорошо, это было преодолено с помощью следующих действий;

  1. Настройка FetchType

    Необходимо установить все FetchType на FetchType.LAZY. В моей модели некоторые из них отсутствовали. Там не было никаких типов Fetchtypes были добавлены. Таким образом, для всех @OneToMany отношений это вводит

  2. Включение транзакции

    Ранее в веб-приложении Spring транзакции не были включены. Он был включен с помощью @EnableTransactionManagement, а соответствующие методы обслуживания были помечены как @Transactional

Сделав выше, я смог минимизировать время, затрачиваемое на сохранение записи. Теперь за 2-4 секунды выполняется около 200-300 запросов.

PS: всегда устанавливайте FetchTypes для ленивых

...