在 REST 服务中使用 AOP 优化数据检索

Data retrieval optimization using AOP in a REST service

我正在使用 Spring MVC(Spring 引导)实现 REST 服务,并且我正在创建一些 Aspect 来处理服务的一些交叉功能。

一个例子是这样的服务方法:

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

在我的 Aspect class 中有这样的方法:

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

如您所见,我有两个方法对同一个用户对象执行不同的操作,所以即使用户已经在主方法中检索到,我也必须执行同一个查询两次。

请注意,对于我服务层中的某些方法,单个方法调用会触发多个方面,这会使用户检索倍增。

所以我想知道:有没有办法至少在 REST(无状态)应用程序的各个方面之间共享对象?您能否建议一种不同的方法来最大限度地减少这些情况下的数据访问?

您可以尝试使用 Spring 级缓存,这里很简单 tutorial,但要小心并额外注意缓存逐出策略。

如果您将 Spring Data JPA 与 Hibernate 或 EclipseLink 一起使用,您还可以尝试在 JPA 实现提供程序中启用二级缓存: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);