У меня проблема с одновременными запросами.Мы получаем одновременный запрос более 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();
}
}