Проблемы с производительностью при использовании JPA - PullRequest
0 голосов
/ 06 ноября 2011

Я использую 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 (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?))

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Запрос сам по себе занимает столько же времени, но Hibernate делает много дополнительных вещей (в зависимости от настроек и модели данных), которые занимают время и память - создать прокси объектов для отложенной загрузки - кешировать их в свой кеш - загрузка данных в прокси в отдельных запросах - создать коллекцию прокси для отношений - ... возможно, готов загрузить их

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

0 голосов
/ 06 ноября 2011

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

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

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

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

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

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

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