2017-09-20 6 views
2

내 응용 프로그램에는 Ehcache를 봄에 제공되는 모 놀리 식 응용 프로그램이 있습니다. 올바르게 작동합니다. 캐시 구성이 서비스 메서드이고 지연로드가 true임을 알아야합니다. DB.like이에서 쿼리되는 개체의 모든 :클러스터 된 응용 프로그램에서 Ehcache가 작동하지 않습니다.

@Transactional 
@Override 
@Caching(evict = { @CacheEvict(value = "schoolCache", key = "#school.id")}) 
public Integer save(School school) { 
     // Code here 
} 

으로 Ehcache에 저장됩니다 분명한는 대학에 진학의 게으른 인스턴스는이 같은 모델과 뷰 모델간에 데이터를 교환하는 컨트롤러 계층에서 ModelMapper입니다 :

@RequestMapping(value = "/load/{Id}", method = RequestMethod.GET) 
@ResponseBody 
public SchoolViewModel load(@PathVariable Integer Id) { 
     SchoolViewModel schoolViewModel = ModelMapper.map(schoolService.loadByEntityId(Id), SchoolViewModel.class); 
     return schoolViewModel; 
    } 

If SchoolVie wModel은 ModelMapper에 의해 컨트롤러에있는 DB로부터 학교에있는 object의 속성을 가져옵니다. 그래서 나는 응용 프로그램을 클러스터하고 Ehcache를 Redis로 설정합니다.
무엇이 문제입니까? 처음에 SchoolService의 요청 쿼리 인 DB로부터의 서비스 쿼리와 최대 절전 모드 세션이 열렸 기 때문에 ModelMapper는 모델을 ViewModel에 성공적으로 매핑합니다. 두 번째로 id와 처음에 동일한 ID로 호출 된 서비스 메소드 시간이 레디 스에서 학교 개체를 가져 학교에있는 개체의 특성을 매핑 할 Hiberante, ModelMapper의 세션이없는 것은 제외하고 ... 예외가이처럼 가져옵니다 org.hibernate :에 의해

를 일으켰습니다. LazyInitializationException이 : 프록시를 초기화하지 수 - org.hibernate.proxy.AbstractLazyInitializ에서 org.hibernate.proxy.AbstractLazyInitializer.initialize (AbstractLazyInitializer.java:165) 없음 세션 er.getImplementation org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke (JavassistLazyInitializer.java:185)에서 (AbstractLazyInitializer.java:286) 그래서

어떻게해야합니까? 나를 도울 수있는 가장 좋은 방법은 무엇입니까? 내가 my book 설명 덕분에 많은

+0

스프링 캐시를 사용하지 마십시오. 2 단계 캐싱을 제대로 수행하도록 최대 절전 모드를 구성하십시오. –

+0

최대 절전 모드 L2 캐시가 다른 앱에서 변경되는 것을 감지하는 방법. 앱 1과 app2에서 개체 변경이 감지되면 어떻게됩니까? –

+0

이것은 캐시 구현에 따라 다르지만 대부분 클러스터 기능을 지원합니다. 이는 Hibernate가 다른 서버에서 실행중인 여러 JVM에 대해서조차도이를 조정할 수 있음을 의미합니다. Ehcache와 Infinispan 모두 그것을 지원합니다. BTW는 몇 가지 더 많은 문제를 해결하므로 스스로 R & D를하지 않는 한 직접 해보라고 조언하지 않습니다. – Sanne

답변

1

, 당신은 당신이 더 서비스 방법에서 필요로하는 모든 단체 초기화해야합니다

  1. 당신에게 : 그래서

    schoolService.loadByEntityId(Id), SchoolViewModel.class) 
    

    을 여러 옵션이 있습니다 JOIN FETCH with a JPQL query을 사용할 수 있습니다.

  2. 또는 Hibernate.unproxy(proxy)을 사용할 수 있습니다.
  3. LAZY 연관을 탐색하기 만하면됩니다.
  4. DTO projection을 사용할 수 있으며 LazyInitializationException에 절대로 대적 할 수 없습니다.