我正在处理同时请求的问题。 我们同时收到1000个以上的请求,每个请求都需要从前一个请求中获取更新的值。我在方法上应用了synced关键字,以便可以比较请求并更新数据库中的值。 如果我不应用同步,那么即使更新后,它也会为所有请求采用相同的对象值。 但是当我同步该方法时,它可以很好地为每个请求更新值,但是提供对请求的响应变得很慢。
获得响应所花费的时间比没有同步花费的时间要慢得多,这可能进一步导致超过1000,2000的请求超时错误,依此类推。 例如,如果不同步,则每个请求的用户数量为10,如果同步此方法,则数量将更新,每个请求的值都将更新。 但是同步方法的唯一问题是处理500个请求需要5分钟,处理1000个请求需要10分钟,依此类推。这可能会导致响应超时错误,从而导致节流。 我们如何在不同步的情况下实现这一目标,因为每个请求都将对数据库进行更新操作,而另一个请求需要获取更新后的值。 请帮我如何提高处理速度。
以下是我如何处理请求的示例:-
//Controller
@RequestMapping(value = "/url", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8")
public @ResponseBody ResponseBean processRequest(@RequestBody InputJsonBean inputjson, HttpServletRequest request,HttpServletResponse httpResponse) {
ResponseBean response = null;
response=interface.processInput(inputjson);
return response;
}
//Service
public ResponseBean processInput(InputJsonBean inputjson) {
ResponseBean simultaneousResponse = testUser(inputjson);
System.out.println("Simultaneous response:" + simultaneousResponse);
if (simultaneousResponse != null) {
System.out.println("Response" + response.toString());
return simultaneousResponse;
}
else{
//do further processing and db operations.
return simultaneousResponse;
}
return simultaneousResponse;
}
private synchronized ResponseBean testUser(InputJsonBean inputjson) {
User user=//get userdetailsfromdatabase through credentials provided in inputjson
//check amount available
if(amountavailable){
//Do processing on inputjson and accordingly update amount in user's account
JndiLookup.getUserDao().mergeUser(user);
return null;
}
else{
return "Insufficient amount response";
}
return null;
}
//UserDAO
public void mergeUser(User user) {
em = getEm();
try {
em.getTransaction().begin();
em.merge(user);
em.getTransaction().commit();
} catch (Exception exception) {
if (em.getTransaction().isActive())
em.getTransaction().rollback();
LOG.error(exception.getMessage());
} finally {
em.close();
}
}