使用spring MVC进行并发更新和检索

时间:2016-04-22 18:54:09

标签: java spring spring-mvc concurrency

我使用Spring MVC + REST构建Web应用程序。我有一些HTTP请求更新用户的状态,另一些用于检索他的状态。

@RequestMapping(value = "/{id}", method = RequestMethod.POST)
@ResponseBody
public HttpEntity answer(@PathVariable(value = "id") Long id, @RequestParam("correct") Boolean result, Principal principal) throws JsonProcessingException, InterruptedException{
    Competence comp = competenceservice.findById(id);
    User user = userService.findByUsername(principal.getName());
    interactionService.registerInteraction(comp, result, user);
    return new ResponseEntity<>(HttpStatus.OK);
}

@RequestMapping(value = "/dailygoal/", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
public HttpEntity<DailyGoal> getDailyGoal(Principal principal) {
    Long goal = userservice.getDailyGoal(principal.getName());
    Long achieved = userservice.getGoalAchieved(principal.getName());
    return new ResponseEntity<>(new DailyGoal(goal, achieved), HttpStatus.OK);
}

我试图让它们尽可能独立,但我遇到了问题:在某些情况下我发出更新用户状态的请求,然后检索更新后的状态(使用另一个请求),但是,由于并发问题(我认为),有时我得到的状态没有更新。我一直在考虑两种可能的解决方案:

  • 1 - 强制在前端进行序列化:第二个请求必须等待第一个请求的响应。 我不喜欢这种解决方案,因为它会因为后端限制而强制规则进入前端。
  • 2 - 强制在后端进行序列化:用户的更新状态是对更新请求的响应;我不喜欢该解决方案,因为它不尊重请求的独立性。 / LI>

在我没有考虑的其中一个选项中是否有重要的东西?有人知道(更好)第三种选择吗?

1 个答案:

答案 0 :(得分:1)

你的第一种方法是完美的。这是因为您始终希望用户在更新数据时查看更新的数据。

如果我要更新字段,请考虑这一点我希望看到结果或错误,以防出现一些一致性问题,以便我可以采取纠正措施。我只能在更新返回200 OK,4XX或5XX后才能执行此操作。因此,您应该始终等待更新响应,并根据响应仅决定下一步做什么。