Hibernate: оптимизация персистентности длинных ArrayLists - PullRequest
1 голос
/ 10 марта 2020

Я столкнулся с несколькими узкими местами в использовании моей базы данных. Я использую PostgreSQL доступ к Hibernate ORM и написан на Java 8.

Вот пример класса, который нуждается в оптимизации:

public class RightEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ElementCollection
  @LazyCollection(LazyCollectionOption.FALSE)
  private List<Long> readableEntity = new ArrayList<Long>();
}

RightEntity - это объект, который позволяет доступ к списку идентификаторов (List of Long). Проблема заключается в том, что всякий раз, когда я загружаю эту сущность, список readableEntity, который содержит сотни элементов, может загружаться несколько секунд одновременно. Это огромное узкое место, потому что оно используется почти во всех API и менеджерах моего сервера.

Мой вопрос: как мне оптимизировать этот код, чтобы он работал более плавно?

LazyCollectionOption.FALSE похож на FetchType.Eager Я пытался загрузить его лениво, он работает намного быстрее, но я получаю LazyCollection всякий раз, когда я пытаюсь загрузить список, поэтому я изучаю альтернативы или исправление.

Спасибо!

1 Ответ

1 голос
/ 10 марта 2020

Для правильного доступа к коллекции ленивых существует механизм JOIN FETCH. Вы можете использовать его в своем запросе JPQL для заполнения отложенной коллекции.

Взгляните на это объяснение от разработчика Hibernate. Вы также можете увидеть этот ТАК вопрос об альтернативном использовании пакетов.

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