【发布时间】:2015-08-03 11:41:10
【问题描述】:
我正在为数据库编写一个 Spring REST 类型接口,该接口将检索各种资源的用户特定结果。
为了保持用户,我有一个名为 CurrentUser 的 spring @Component 注释 bean 作为临时措施。
@Component
public class CurrentUser {
@Autowired
private UserDAO userDAO;
private String userId;
private String email;
private String notes;
public String getUserId() {
return userId;
}
public void setUserId(String userId) throws ApiException {
User user = userDAO.getUser(userId) // Database call to
if (!user.isValid()) {
throw ApiException(...) // The exception would crash back to the user as a error in the response
}
// Valud user so set these aspects.
this.userId = user.userId;
this.email = user.email;
}
}
使用以下拦截器在每次调用 API 中的任何方法时在 Spring 拦截器中初始化此对象。
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
@Autowired
private CurrentUser user;
@Autowired
private RequestParameters requestParameters;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ApiException {
user.setUserId(StringUtils.defaultString(request.getParameter("userId"), "defaultUser"));
return true;
}
}
这只是一个占位符,用于识别用户,直到可以添加正确的身份验证。
我对 Spring 比较陌生,以及这篇文章的原因 是为了增加我在这种情况下对 Spring 的线程安全方面的理解
我最近发现 Spring 不是自动线程安全的,我可能需要更多地考虑范围。
我想了解的是:
对于上述设置,是否存在 1000 个并发请求可能相互干扰和覆盖的危险? 例如针对一个用户的请求可能会被不同的用户覆盖,而不是单独的 http 请求,从而导致请求者接收到错误的数据。
解决此问题的最佳方法是什么。 (即使它会被替换,我也有其他对象以类似的方式实例化) 我正在查看的选项(如果这是一个问题)是设置原型范围,或者直接附加到请求/会话而不是允许它们自己的自动装配对象。
任何人都可以提供给我的任何信息将不胜感激,因为我喜欢一开始就正确(呃),而不是稍后处理错误的假设。
【问题讨论】:
-
我们甚至有过这样的疑问,并进行了严格的批量测试,发现spring默认不处理基于请求的数据。因此,要么在项目和服务层中启用基于事务的配置。您还可以在 Request 范围内配置 bean,理想情况下,它具有将同步块放入方法中的类似效果。
标签: java multithreading spring rest