Я использую весеннюю модель MVC в своем проекте. В котором контроллер получает запрос от какого-то определенного приложения сторонней стороны. Контроллер получает 20 запросов в секунду. Код выглядит следующим образомКак улучшить производительность с использованием многопоточности весной Mvc
@Controller
@RequestMapping("/action")
public class FrontController{
@AutoWired
private CommonService commonService;
(First Code)
@RequestMappint("/save")
public String saveData(@PathParam("id")String did){
List<String, Object> map = commonService.getVmn(did);
CallReporting callReporting = new CallReporting();
callReporting.setName(map.get("name"));
so---on (have 15 field)
commonService.save(callReporting);
}
return "1";
}
Этот код работает нормально, но через некоторое время, если MySQL занят, то требуется время, чтобы вернуть значение для вызова приложения. Итак, я бросил идею и начал асинхронное общение.
(Second Code)
@RequestMappint("/save")
public String saveData(@PathParam("id")String did){
Thread thread = new Thread(new Runnable(){
List<String, Object> map = commonService.getVmn(did);
CallReporting callReporting = new CallReporting();
callReporting.setName(map.get("name"));
so---on (have 15 field)
commonService.save(callReporting);
});
}
return "1";
}
Я начал использовать код примерно так. Так что вызывающая сторона может немедленно получить ответ (уменьшить время ответа), а затем мое приложение продолжит работу. Но в первом коде я тестирую нагрузку с помощью JMeter (20 req/sec) и обнаружил, что он работает нормально с нагрузкой процессора (3%). Но во втором коде с той же загрузкой загрузка процессора будет более чем на 100%. Когда я начал использовать ThreadPoolTaskExecutor с более низкой конфигурацией.
@AutoWired
private ThreadPoolTaskExecutor executor;
@RequestMappint("/save")
public String saveData(@PathParam("id")String did){
//Assume this code is in MyRunnableWorker Class
List<String, Object> map = commonService.getVmn(did);
CallReporting callReporting = new CallReporting();
callReporting.setName(map.get("name"));
so---on (have 15 field)
commonService.save(callReporting);
MyRunnableWorker worker = new MyRunnableWorker();
executor.execute(worker)
return "1";
}
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="50" />
<property name="maxPoolSize" value="100" />
<property name="keep-alive" value="10" />
<property name="queueCapacity" value="200" />
</bean>
но нашел тот же результат. Что-то не так с кодом, может кто-нибудь мне подскажет. Одна важная вещь, когда я тестирую Jmeter в стадии застройки, тогда загрузка перемещается между 30% и 70%. Но на сервере производства это всегда около 100%. Это java, потребляющий 100%, другой процесс довольно низок. Производственная машина, оснащенная ОС Linux. обработчик гексакора, имеющий 128 ГБ ОЗУ. Может кто-нибудь сказать мне, что делать.
ok Than Почему cpu load increse во втором коде, где я не использовал пул потоков. Во-вторых, я не могу использовать пакет в этом случае. Система запроса часто запрашивает запрос, а затем эта запись будет просматриваться пользователем в части MIS. Другая причина, по которой какая-то временная система находится в режиме ожидания. Поэтому я должен ударить db один к одному. –
Simillar причина. Вы создаете много потоков. Больше, чем количество ядер. Пожалуйста, прочитайте о Amdahl Law http://en.wikipedia.org/wiki/Amdahl%27s_law, это очень хорошее объяснение, почему создание множества потоков может снизить производительность. –