Проблемы с производительностью при использовании JPA

#java #hibernate #jpa

#java #спящий режим #jpa

Вопрос:

Я использую JPA в своем веб-приложении (поставщиком является hibernate), и я в замешательстве относительно производительности запросов. В моем коде я использую следующий запрос:

 select c.id from Cdr c where c.receivedOn >= :start and c.receivedOn < :end and c.buy.id in (:buyList)
  

Выполнение этого запроса непосредственно к базе данных занимает 0,1 секунды.
Запуск этого через сервер занимает несколько минут, чего мне здесь не хватает?

вот запрос, сгенерированный java:

 select cdr0_.id as col_0_0_ from billing_cdr cdr0_ where cdr0_.received_on>=? and cdr0_.received_on<? and (cdr0_.buy_id in (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?))
  

Комментарии:

1. Вы активировали трассировку, как выглядит собственный SQL-запрос?

2. @home я добавил сгенерированный запрос

Ответ №1:

Сам запрос занимает столько же времени, но hibernate выполняет множество дополнительных функций (в зависимости от настроек и модели данных), которые потребляют время и память — создание прокси-серверов объектов для отложенной загрузки — кэширование их в собственный кэш — загрузка данных в прокси-серверы в отдельных запросах — создание прокси-серверов коллекций для отношений — … возможно, их загрузка

Просто активируйте трассировку гибернации и посмотрите, что происходит на самом деле (обычно много)

Комментарии:

1. если использовать собственный запрос (EntityManager.createNativeQuery), смогу ли я обойти дополнительные материалы?

2. Да. Но вы потеряете все модные вещи, которые JPA предоставляет для вас. Итак, вы можете хорошо работать с простым JDBC

Ответ №2:

Я думаю, вы можете перейти по этой ссылке

Как улучшить производительность JPA

было действительно полезно для меня.

Редактировать: пусть вас не смущает производительность запросов. потому что это необходимо в первый раз. если вы думаете о том, что кэш данных реализован поставщиками сохраняемости (JPA) для повышения производительности за счет сокращения обращений к данным базы данных. Просто подумайте о том, когда миллионы пользователей делают вид, что обращаются к одной и той же строке таблицы, к которой они обычно обращались, чтобы открыть соединение с базой данных, а затем данные были извлечены из таблицы, в этом смысле база данных стала узким местом для многих приложений; вот почему кэширование данных имеет первостепенное значение для новых веб-приложений; в этом смысле Java Persistence API предлагает множество возможностей для повышения производительности за счет использования множества распределенных кэш-фреймворков.

Итак, если реализован кэш, то этот выполняемый вами запрос не займет так много времени при втором запросе.

(Хотя и не по теме) С другой стороны, JPA освобождает программиста от ручной обработки постоянных данных в операциях CRUD, следовательно, сокращая время разработки и затраты на обслуживание, достаточно предоставить схему базы данных для автоматической генерации большинства операций CRUD, необходимых для разработки системы.