У меня есть служба получения, в которой несколько вызовов db задействуются один за другим, и это замедляет работу моей службы. Я сделал это немного быстрее, оптимизировав вызовы db, но все же это занимает больше времени. есть ли лучший способ использовать концепцию многопоточности для вызова выполнения асинхронным способом. Я планирую использовать здесь многопоточность для асинхронной обработки вызовов db, чтобы сделать службу более быстрой. Но я изо всех сил пытаюсь это сделать и прошу помочь мне с лучшим подходом
Контроллер:
@RequestMapping(value = "/getEmpPerformanceData", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<EmpPerformanceGUIConfig> getEmpPerformanceData(
@RequestParam("empId") Integer empId,
@RequestParam("appr_id") Integer appraisalId,
Boolean isTeamMember) {
EmpPerformanceGUIConfig empPerformanceGUIConfig = new EmpPerformanceGUIConfig();
try {
empPerformanceGUIConfig = empService.getEmpPerformanceData(empId, appraisalId, isTeamMember);
return new ResponseEntity<>(HttpStatus.OK);
} catch (Exception ex) {
//exception handled
}
}
Сервис:
public EmpPerformanceGUIConfig getEmpPerformanceData(Integer empId, Integer appraisalId, Boolean isTeamMember) {
EmpSheetMstr empSheetMstr = service.getEmpSheetMstr(appraisalId, empId);
empPersonalData emp = empService.getDataByEmpId(empId.toString(), appraisalId, CarexAppConstant.emp_ID);
EmpAchievment empAchievment =
service.getEmpAchievmentbyEmpId(new empNew(emp.getEmpId()), new AppraisalPeriod(appraisalId), sessionFactory);
int empAchievmentStatusId = empAchievment.getGoalStatusId();
EmpPerformanceGUIConfig guiConfig = new EmpPerformanceGUIConfig();
guiConfig.setEmpAchievmentIsCompleted(EmpAchievmentStatusId == 2222);
guiConfig.setEmpId(empId);
guiConfig.setEmpName(emp.getEmpName());
guiConfig.setEmpDesignation(emp.getDesignation());
guiConfig.setAppraisalId(appraisalId);
guiConfig.setSupervisorId(emp.getManagerId());
if (empSheetMstr == null) {
empSheetMstr = insertEmpSheetMstr(empId, appraisalId); //update only one field
}
EmpSheetMstr empSheetMstr = empSheetMstr;
guiConfig.setEmpSheetId(empSheetMstr.getEmpSheetId());
String empSheetStatus = empSheetMstr.getIdpStatus();
guiConfig.setempSheetStatus(empSheetStatus);
guiConfig.setEmpWorkDoneData(getEmpWorkDoneData(appraisalId, empSheetMstr)); //db call
if (BooleanUtils.toBoolean(isTeamMember)) {
List<GUIConfig> ratingDataList = PrepareRatingData(empSheetMstr, "PeopleManager", null);
guiConfig.setratingDataList(ratingDataList);
guiConfig.setRatingComments(ratingDataList.get(0).getComments());
guiConfig.setEmpUtilizationData(getEmpUtilizationData(appraisalId, guiConfig.getEmpSheetId())); //db call
}
guiConfig.setEmpInovativeIdeaData(getEmpInovativeIdeaData(appraisalId, empSheetMstr)); //db call
guiConfig.setEmpPatentSubmissionData(getEmpPatentSubmissionData(appraisalId, empSheetMstr)); // complicated db call
guiConfig.setRatingComments(getRatingComments(empSheetMstr)); //complicated db call
//many more db call
return guiConfig;
}
пример метода вызова db :
public EmpSheetMstr getEmpSheetMstr(int appraisalId, int empId) {
EmpSheetMstr empMstr = (EmpSheetMstr) HibernateService.getSession(sessionFactory)
.createCriteria(EmpSheetMstr.class)
.add(Restrictions.eq("appraisalId", appraisalId))
.add(Restrictions.eq("empId)").uniqueResult();
return empMastr;
}
Может ли кто-нибудь помочь мне здесь с лучшим подходом к реализации многопоточности. Спасибо