Репозиторий Java JPA медленно читается - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть база данных с довольно большой моделью сущностей. Всего 14 таблиц, в среднем около 100 000 записей.

Когда я протестировал свое приложение, которое берет одну сущность из базы данных, преобразует ее в json и возвращает ее вызывающей стороне, получение записи заняло 7 секунд.

Это не похоже на проблему инициализации, потому что, если я делаю один и тот же вызов два раза подряд, они оба получают около 10 секунд для получения данных.

Когда я включаю ведение журнала сценария sql, я обнаруживаю, что для каждого прочитанного объекта hibernate отправляет сотни запросов sql в базу данных. (Фактическое число зависит от количества подключений / лицензий / продуктов / услуг и т. Д., Которые есть у организации, но для моей тестовой записи я получил 286 запросов (что в общей сложности заняло около 7 секунд)) Когда база данных пуста (за исключением данных, которые должен вернуть тест), это занимает около 6 секунд.

Полагаю, проблема в том, что для моих @ OneToMany's и @ ManyToMany выборки установлены на Lazy, но когда я устанавливаю их в eager, я получаю ошибку нескольких пакетов для извлечения.

@javax.persistence.OneToMany(fetch = javax.persistence.FetchType.LAZY)
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.FALSE)
@javax.persistence.JoinColumn(name = "ProductId")

Это пример имеющегося у меня отношения OneToMany, которое имитирует активную выборку без ошибки в нескольких пакетах.

Это общая проблема? И как мне улучшить скорость чтения?

1 Ответ

0 голосов
/ 25 апреля 2018

Hibernate не позволяет иметь более одной коллекции типа List, помеченной как EAGER.

Для загрузки данных лучше всего использовать JOIN FETCH

select e from YourEntity JOIN FETCH e.yourList l

Другим вариантом может быть использование EntityGraph для определения загрузки EAGER.

Подробнее об этой теме читайте здесь:

https://vladmihalcea.com/hibernate-facts-the-importance-of-fetch-strategy/

Если вы используете интерфейсы репозитория Spring Data JPA, вы можете использовать NamedEntityGraphs:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-graph

...