Реализация многопоточности в службе REST приложения Spring Boot для ускорения вызова get / post - PullRequest
0 голосов
/ 14 июля 2020

У меня есть служба получения, в которой несколько вызовов 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;
}

Может ли кто-нибудь помочь мне здесь с лучшим подходом к реализации многопоточности. Спасибо

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