同步关键字对于Java中的同时请求很慢

时间:2018-12-12 06:55:01

标签: httprequest synchronized

我正在处理同时请求的问题。 我们同时收到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();
    }

}

0 个答案:

没有答案