2017-02-13 5 views
0

Запросы запроса, не работающие в Eclipse Link 2.3.2/2.6.1 при использовании для извлечения данных со второго кэш-память используемые подсказки,javax.persistence.cache.retrieveMode и javax.persistence.cache.retrieveMode не работает с NamedQuery при использовании с Eclipse Link ORM

@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") 

Пробовал с ниже вариантов.

1. Added JPA Hints to Named query itself 
@NamedQuery(
name = TestEntity.FIND_BY_CODE, 
query = "select t from Test t where t.code = :code", 
hints = { 
@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") }) 

2. Adding hints to the Entity Manager Itself after injecting it 
em.setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE); 
em.setProperty("javax.persistence.cache.storeMode", CacheRetrieveMode.USE); 

3. Added JPA hints at the time of Query execution 
em.createNamedQuery(TestEntity.FIND_BY_CODE, 
AlertCategoryType.class).setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE) 
.setHint("javax.persistence.cache.storeMode", CacheStoreMode.USE) 
.setParameter("code", code).getSingleResult(); 

Ничего из вышеперечисленного использования советов не работает. Затем я попытался отлаживать три разных варианта, что я нашел, Запрос базы данных, который формировался после установки этих подсказок, передает подсказки в качестве пары ключ/значение ниже.

eclipselink.query.hints => {javax.persistence.cache.retrieveMode=USE,                              javax.persistence.cache.storeMode=USE} 

Где eclipselink.query.hints - это ключ, даже если мы установили подсказки JPA. Это то, что мы не контролируем, чтобы изменить это.
Но когда я передаю подсказки Eclipse Link, приведенные ниже, он начал работать как ожидалось, и результаты будут получены из кэша, а не из БД.

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 

Это означает, что при использовании Eclipse-Link он распознает только Eclipse, Link при условии, намеков в соответствии с клавишей [вышеуказанному] мы видим в запросе.

Пожалуйста, предложите любую работу вокруг, чтобы получить подсказки JPA работать

Окружающая среда Я использую

  • Eclispe Link 2.3.2/2.6.1
  • Runnin плавник служат Glassfish 4.1 [скумбриевидный гидролик ]
  • Java8/JEE7

ответ

1

подсказка запроса вы заявляете работает (eclipselink.query-результаты кэш) полностью не связан - он создает новый кеш для результатов запроса, поэтому в следующий раз, когда вы выполняете тот же запрос, результаты уже есть, поэтому ему не нужно снова выполнять запрос. Это снаружи (выше превышения) кеша второго уровня.

Установки, которые вы называете неработоспособными, влияют на кеш второго уровня. Без дополнительной информации я собираюсь заявить, что они, вероятно, работают так, как ожидалось. Просто потому, что ваш запрос идет в базу данных, не означает, что кеш не используется. Объекты кэширования сильно отличаются от кэширования результатов запроса. Если результаты запроса не кэшируются, если вы не включили запрос в память, большинство запросов типа «все-все» должны перейти в базу данных, чтобы определить, какие объекты нужно создавать и возвращать. EclipseLink будет использовать эти результаты для проверки кеша, если сущности уже существуют, они возвращаются как есть - это позволяет избежать накладных расходов на восстановление объектов из данных.

Вы можете проверить, был ли ваш объект кэширован с помощью запроса em.find() или чтения, который использует значение ID. Кэш индексируется по идентификатору, поэтому ему не нужно идти в базу данных, чтобы выяснить, какие объекты вы хотите.

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