Синхронизированное ключевое слово медленно для одновременных запросов в Java - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблема с одновременными запросами.Мы получаем одновременный запрос более 1000, и каждый запрос нуждается в обновленном значении по сравнению с предыдущим, я применил синхронизированное ключевое слово к методу, чтобы я мог сравнить запросы и обновить значение в базе данных.Если я не применяю синхронизированный, он принимает одно и то же значение объекта для всех запросов даже после обновления.Но когда я синхронизировал метод, он работает нормально - получает обновленное значение для каждого запроса, но он стал намного медленнее предоставлять ответ на запросы.

Время, затрачиваемое на получение ответа, намного медленнее, чем безсинхронизирован. Это может привести к ошибке тайм-аута для запросов более 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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...