Java REST服务中使用AOP的数据检索优化
我正在使用SpringMVC(SpringBoot)实现一个REST服务,并且我正在创建一些方面来处理服务的一些跨功能 例如,服务方法如下所示: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(.
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
。这似乎是一个不错的建议。谢谢。这似乎是个不错的建议。谢谢