2017-02-13 11 views
0

Eclipse에서 작동하지 않는 쿼리 힌트 2.3.2/2.6.1에서 데이터를 가져 오는 데 사용되는 경우 레벨 캐시 중고 힌트,Eclipse Link와 함께 javax.persistence.cache.retrieveMode 및 javax.persistence.cache.retrieveMode가 NamedQuery와 작동하지 않음 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에서 제공하는 힌트를 아래와 같이 전달하면 예상대로 작동하기 시작하고 결과가 캐시가 아니라 DB에서 가져옵니다.

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

즉, 이클립스 링크를 사용할 때 쿼리에서 볼 수있는 [위 그림] 키에 따라 Eclipse 링크 제공 힌트 만 인식한다.

글래스 피시 4.1 [payara를 제공

  • Eclispe 링크를

    환경 내가 사용 작업 JPA 힌트를 얻기 위해 주위 2.3.2/2.6.1

  • 박차 핀을 모든 작업을한다 제안하십시오 ]
  • Java8/JEE7

답변

1

당신이 상태 쿼리 힌트가 작동 (eclipselink.query-결과 캐시) 는 완전히 무관합니다. 쿼리 결과에 대한 새 캐시를 만들어 다음 번에 같은 쿼리를 실행하면 결과가 이미 있으므로 쿼리를 다시 실행할 필요가 없습니다. 이것은 2 차 레벨 캐시 외부 (이상)입니다.

작동하지 않는 설정은 2 차 수준 캐시에 영향을줍니다. 더 많은 정보가 없다면, 나는 그들이 예상대로 일할 가능성이 있다고 말 할 것입니다. 쿼리가 데이터베이스로 이동한다고해서 캐시가 사용되지 않는다는 의미는 아닙니다. 엔티티 캐싱은 결과를 쿼리에 캐싱하는 것과 매우 다릅니다. 쿼리 결과가 캐시되지 않은 경우 메모리 내 쿼리를 사용하도록 설정하지 않은 경우 대부분의 전체 읽기 유형 쿼리는 데이터베이스로 이동하여 어떤 엔터티를 만들어서 반환해야하는지 결정해야합니다. 그런 다음 엔트리가 캐시를 점검하기 위해이 결과를 사용합니다. 엔티티가 이미 존재하고 반환 된 경우 엔 데이터에서 엔티티를 다시 빌드하는 오버 헤드가 발생하지 않습니다.

ID 값을 사용하는 em.find() 또는 읽기 쿼리를 사용하여 엔티티가 캐시되었는지 확인할 수 있습니다. 캐시는 ID로 인덱싱되므로 원하는 엔티티를 파악하기 위해 데이터베이스로 이동할 필요가 없습니다.