2016-07-04 3 views
1

Ich implementiere einen REST-Service mit Spring MVC (Spring Boot) und erstelle einige Aspect s, um einige Cross-Funktionalitäten des Service zu handhaben.Optimierung des Datenabrufs mithilfe von AOP in einem REST-Service

Ein Beispiel ist eine Service-Methode wie folgt aus:

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

und in meiner Aspect Klasse eine Methode wie folgt:

@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... 
} 

Wie Sie sehen können, habe ich zwei Methoden mit verschiedenen Dingen zu tun das gleiche Benutzerobjekt, also muss ich dieselbe Abfrage zweimal ausführen, auch wenn der Benutzer bereits in der Hauptmethode abgerufen wurde.

Beachten Sie, dass für bestimmte Methoden in meiner Serviceebene mehrere Aspekte durch einen einzigen Methodenaufruf ausgelöst werden, dies multipliziert die Benutzerabfrage mehrmals.

Also frage ich mich: Gibt es eine Möglichkeit, Objekte mindestens unter Aspekten in einer REST (statuslosen) Anwendung zu teilen? Können Sie einen anderen Ansatz vorschlagen, um den Datenzugriff in diesen Situationen zu minimieren?

+0

_ „so muß ich die gleiche Abfrage zweimal ausführen“ _ Das hängt davon ab, wie Sie die Daten laden. Vielleicht ist der Benutzer bereits zwischengespeichert. Andernfalls können Sie es zwischenspeichern, z. mit '@ Cachable'. – zeroflagL

Antwort

0

Sie können versuchen, Spring-Level-Caching zu verwenden, hier ist einfach tutorial, aber seien Sie vorsichtig und zahlen Sie zusätzliche Aufmerksamkeit auf Cache-Räumungsrichtlinien. Example

+0

Das scheint ein netter Vorschlag zu sein. Vielen Dank. – davioooh

0

Versuchen Sie es mit java.lang.ThreadLocal für diese usecases:

Wenn Sie Spring Data JPA mit Hibernate oder Eclipselink verwenden, können Sie auch den zweiten Level-Caching in Ihrem JPA-Implementierung Anbieter zu ermöglichen versuchen. Es ist sehr praktisch, und ich benutze es immer für den Austausch von Daten

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); 
Verwandte Themen