#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, необходимых для разработки системы.