2016-07-04 2 views
1

Spring MVC (Spring Boot)를 사용하여 REST 서비스를 구현 중이며 서비스의 일부 교차 기능을 처리하기 위해 Aspect을 생성 중이다. 당신이 볼 수 있듯이, 나는 두 가지 방법으로 다른 일을하고있는REST 서비스에서 AOP를 사용한 데이터 검색 최적화

@Around("execution(* com.test.myrestsvc.services.MyService.doSomethingWithUser(..))") 
public void aroundDoSomething(ProceedingJoinPoint pjp) throws Throwable { 
    // retrieve user (the same retrieved in the method) and do something else... 
} 

:

public void doSomethingWithUser(int userId){ 
    // retrieve user from DB and do something... 
} 

Aspect 클래스에서이 같은 방법

예는이 같은 서비스 방법입니다 같은 사용자 개체, 그래서 사용자가 이미 메인 메서드에서 검색되는 경우에도 동일한 쿼리를 두 번 실행해야합니다.

내 서비스 계층의 특정 메소드에 대해 단일 메소드 호출에 의해 트리거되는 여러 측면이 있습니다.이 경우 사용자 검색이 여러 번 수행됩니다.

그래서 궁금합니다. REST (상태 비 저장) 응용 프로그램의 여러 측면에서 객체를 공유하는 방법이 있습니까? 이러한 상황에서 데이터 액세스를 최소화하기 위해 다른 접근 방식을 제안 할 수 있습니까?

+0

_ "동일한 쿼리를 두 번 실행해야합니다."_ 데이터를로드하는 방법에 따라 다릅니다. 어쩌면 사용자가 이미 캐시 된 것일 수 있습니다. 그렇지 않으면 캐시 할 수 있습니다. @ Cachable을 사용하여. – zeroflagL

답변

0

스프링 레벨 캐싱을 사용하려고 할 수 있습니다. 여기서는 단순한 tutorial이지만 캐시 제거 정책에주의를 기울여야합니다.

당신이 최대 절전 모드 또는 EclipseLink가와 스프링 데이터 JPA를 사용하는 경우, 당신은 또한 당신의 JPA 구현 제공자에 두 번째 레벨 캐시를 사용하려고 할 수 있습니다

+0

이것은 좋은 제안 인 것 같습니다. 감사. – davioooh

0

Example이 쓰임새에 대한 java.lang.ThreadLocal를 사용해보십시오. 그것은 매우 편리하고 항상 데이터 공유에 사용합니다.

ThreadLocal<SessionMap> sessionThreadLocal = new ThreadLocal<SessionMap>(); 
SessionMap session = sessionThreadLocal.get(); 
    if (null == session) { 
     session = new SessionMap(); 
     sessionThreadLocal.set(session); 
    } 
    User userObj = //getUser; 
    session.put("user", userObj); 
관련 문제