【问题标题】:Data retrieval optimization using AOP in a REST service在 REST 服务中使用 AOP 优化数据检索
【发布时间】:2016-07-05 15:04:38
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • “所以我必须执行两次相同的查询” 这取决于您如何加载数据。也许用户已经被缓存了。否则你可以缓存它,例如使用@Cachable

标签: java spring spring-mvc aop


【解决方案1】:

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

如果您将 Spring Data JPA 与 Hibernate 或 EclipseLink 一起使用,您还可以尝试在您的 JPA 实现提供程序中启用二级缓存:Example

【讨论】:

  • 这似乎是一个不错的建议。谢谢。
【解决方案2】:

尝试对这些用例使用 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);

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2017-01-02
    • 2015-09-06
    • 2018-07-24
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多