2012-02-05 2 views
4

나는 guice-servlet이있는 환경을 tomcat에서 실행하고 guice-persist 아래에서 최대 절전 모드를 사용하고 있습니다. 내가 만난 문제는 하나의 요청에서 em.getReference()를 사용할 때로드 된 프록시 객체가 entitymanager 캐시에 머물러 있으며 객체가 DB에서 완전히로드 될 것으로 기대하는 다른 요청에 나타날 수 있다는 것입니다.guice-persist가있는 자동으로 지운 세션

기본 동작 인 EJB3 환경에서 최대 절전 모드를 사용하곤합니다. 엔티티 관리자 캐시는 새로운 요청마다 명확합니다. guice-persist가 각 요청에 대해 세션을 지우는 것이 더 안전한 행동이 아닌가? 아니면 적어도 JpaPersistModule의 설정으로 제공 하시겠습니까?

EJB3 동작을 담당하는 최대 절전 모드 SessionImpl "autoClear"에는 특별한 플래그가 있습니다. 새로운 엔티티 관리자가 JpaPersistModule에 의해 생성 될 때 플래그를 활성화 할 수있는 방법이 있습니까?

답변

3

이 방법으로 해결 : JpaPersistService에서 반환 한 EntityManager를 잡기위한 AOP 인터셉터를 만들었습니다. 내가 EntityManagerImpl을 통해 SessionImpl을 받고 autoClear 속성을 설정하고있어 인터셉터 내부

bindInterceptor(Matchers.subclassesOf(PersistService.class), 
     Matchers.returns(Matchers.identicalTo(EntityManager.class)), 
     new EntityManagerInterceptor() 
); 

.

public Object invoke(MethodInvocation invocation) throws Throwable { 
    Object result = invocation.proceed(); 
    if (result instanceof EntityManagerImpl) { 
     EntityManagerImpl castedEm = (EntityManagerImpl) result; 
     ((SessionImpl) castedEm.getSession()).setAutoClear(true); 
    } 
    return result; 
} 
+0

같은 효과로 'castedEm.clear()'를 호출 할 수도 있습니다. 오래된 데이터의 문제를 해결합니다. – condit

관련 문제