2013-02-14 10 views
0

Я только что начал использовать JPA (с реализацией EclipseLink). У меня есть очень простой запрос, напримерJPA (с EclipseLink) Ошибка производительности

(1) entityManager.find (SomeEntity.class, SomeEntityPK); (2) entityManager.createQuery («Выберите x из SomeEntity x, где x.isDefault = true»). GetResultList();

Число записей в таблице SomeEntity составляет около 50 (очень маленькая таблица).

Запрос (1) первоначально занимает 3 секунды, но последующий удар занимает всего 200 мс. Очевидно, что кеш играет. Однако Query (2) принимает 2s для всех вызовов - удивляйтесь, почему кеш не используется. Я понимаю, что Query (те, кто не использует Id или Index) всегда обращается к DB, а отношения Entity используются из Cache.

Есть ли способ улучшить производительность? Простой выбор JDBC принимает только < 300ms для получения данных для Query (2).

[ДОПОЛНЕНО] Я думаю, что я решил проблему. Одним из колумбов в таблице «SomeEntity» был Oracle XMLType. Из-за некоторой проблемы мне пришлось удалить это поле и вместо этого использовать поле CLOB для хранения данных XML. и вуаля, JPA внезапно начала кэшировать результат запроса. Хотя я не знаю причины, почему JPA не кэширует XMLType.

+0

EntityManager API (найти, слияние ...) выполняет по-разному с пользовательским запросом. entityManager всегда будет пытаться искать объект из контекста персистентности. он только смотрит в БД, когда объект не найден int persistence context. После того как экземпляр объекта загружается в контекст персистентности, он становится кэшированным до тех пор, пока транзакция не будет выполнена или не будет вручную очистить контекст сохранения. Вот почему второй запрос выполняется намного быстрее. Пользовательский запрос будет передавать кеш контекста персистентности для взаимодействия с БД каждый раз. – spiritwalker

ответ

1

EclipseLink имеет несколько кешей на разных уровнях, которые можно использовать. Я думаю, что кэш запросов, что вы могли бы искать описанном здесь http://docs.oracle.com/cd/E25054_01/core.1111/e10108/toplink.htm#BCGEGHGE И объяснил немного здесь http://wiki.eclipse.org/Introduction_to_EclipseLink_Queries_%28ELUG%29#How_to_Cache_Query_Results_in_the_Query_Cache

Смежные вопросы