2016-07-04 6 views
1

Spring MVC(Spring Boot)を使用してRESTサービスを実装していますが、サービスのいくつかのクロス機能を処理するためにAspectを作成しています。RESTサービスでAOPを使用したデータ検索の最適化

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

と私のAspectクラスで、このような方法:

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

あなたが見ることができるように、私は別のことをやって二つの方法があります

の例では、このようなサービス方法であります同じユーザーオブジェクトであるため、ユーザーが既にメインメソッドで取得されていても、同じクエリを2回実行する必要があります。

私のサービス層の特定のメソッドでは、1回のメソッド呼び出しによってトリガされるいくつかの側面があります。これにより、ユーザーの取得回数が何度か増えます。

私は、少なくともREST(ステートレス)アプリケーションのアスペクト間でオブジェクトを共有する方法はあるのでしょうか?これらの状況でデータアクセスを最小限に抑えるために、別のアプローチを提案できますか?

+0

_ "私は同じクエリを2回実行する必要があります" _これはデータのロード方法によって異なります。ユーザーが既にキャッシュされている可能性があります。それ以外の場合はキャッシュすることができます。 '@ Cachable'を使用します。 – zeroflagL

答えて

0

スプリングレベルキャッシングを使用できます。ここでは単純なtutorialですが、キャッシュエビクションポリシーには注意が必要です。

あなたが休止状態またはEclipseLinkはと春データJPAを使用している場合、また、あなたのJPA実装プロバイダにセカンドレベルキャッシュを有効にしようとすることができます:Example

+0

これは素晴らしい提案です。ありがとう。 – davioooh

0

は、これらのユースケースのため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);