Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST服务中使用AOP的数据检索优化_Java_Spring_Spring Mvc_Aop - Fatal编程技术网

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

Java REST服务中使用AOP的数据检索优化,java,spring,spring-mvc,aop,Java,Spring,Spring Mvc,Aop,我正在使用SpringMVC(SpringBoot)实现一个REST服务,并且我正在创建一些方面来处理服务的一些跨功能 例如,服务方法如下所示: public void doSomethingWithUser(int userId){ // retrieve user from DB and do something... } @Around("execution(* com.test.myrestsvc.services.MyService.doSomethingWithUser(.

我正在使用SpringMVC(SpringBoot)实现一个REST服务,并且我正在创建一些方面来处理服务的一些跨功能

例如,服务方法如下所示:

public void doSomethingWithUser(int userId){
    // retrieve user from DB and do something...
}
@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...
}
在我的
方面
a类方法中,如下所示:

public void doSomethingWithUser(int userId){
    // retrieve user from DB and do something...
}
@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级别的缓存,这很简单,但要小心,并额外注意缓存逐出策略


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

您可以尝试使用Spring级缓存,这里很简单,但请注意缓存逐出策略


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

尝试对这些用例使用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);
ThreadLocal sessionThreadLocal=new ThreadLocal();
SessionMap session=sessionThreadLocal.get();
if(null==会话){
session=新SessionMap();
sessionThreadLocal.set(会话);
}
User userObj=//getUser;
session.put(“用户”,userObj);

尝试在这些用例中使用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);
ThreadLocal sessionThreadLocal=new ThreadLocal();
SessionMap session=sessionThreadLocal.get();
if(null==会话){
session=新SessionMap();
sessionThreadLocal.set(会话);
}
User userObj=//getUser;
session.put(“用户”,userObj);

“因此我必须执行相同的查询两次”,这取决于您如何加载数据。可能用户已经被缓存了。否则,您可以缓存它,例如使用
@Cachable
“因此我必须执行相同的查询两次”,这取决于您如何加载数据。可能用户已经被缓存了。否则您可以缓存它,例如使用
@Cachable
。这似乎是一个不错的建议。谢谢。这似乎是个不错的建议。谢谢