Как многопоточное обновление базы данных, которая обновляется с помощью кода SQL? - PullRequest
1 голос
/ 08 ноября 2019

Я создал базовое CRUD-приложение для весенней загрузки, которое подключается к базе данных Postgresql. Я получаю доступ к БД через SQL-код в моем employeeDao, который позже вызывается в Контроллере через класс employeeService. Теперь мне нужно обновить БД, используя многопоточный метод, но я не знаю, как это реализовать.

Я создал taskExecutor, но я не знаю, как его использовать.

public Executor taskExecutor () {

    final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(2);
    executor.setQueueCapacity(50);
    executor.setThreadNamePrefix("EmployeeThread-");
    executor.initialize();
    return executor;
}

Это мой EmployeeDaoImpl:

public class EmployeeDaoImpl implements EmployeeDao{

    public EmployeeDaoImpl(NamedParameterJdbcTemplate template) {  
        this.template = template;  
}  
    NamedParameterJdbcTemplate template;  

    @Override
    public List<Employee> findAll() {
        return template.query("select * from employee", new EmployeeRowMapper());
    }
    @Override
    public void insertEmployee(Employee emp) {
         final String sql = "insert into employee(employeeId, employeeName ) values(:employeeId,:employeeName)";

            KeyHolder holder = new GeneratedKeyHolder();
            SqlParameterSource param = new MapSqlParameterSource()
                    .addValue("employeeId", emp.getEmployeeId())
                    .addValue("employeeName", emp.getEmployeeName());
            template.update(sql,param, holder);

    }

    @Override
    public void updateEmployee(Employee emp) {
         final String sql = "update employee set employeeName=:employeeName where employeeId=:employeeId";

            KeyHolder holder = new GeneratedKeyHolder();
            SqlParameterSource param = new MapSqlParameterSource()
                    .addValue("employeeId", emp.getEmployeeId())
                    .addValue("employeeName", emp.getEmployeeName());
            template.update(sql,param, holder);

    }

    @Override
    public void executeUpdateEmployee(Employee emp) {
         final String sql = "update employee set employeeName=:employeeName where employeeId=:employeeId";


         Map<String,Object> map=new HashMap<String,Object>();  
         map.put("employeeId", emp.getEmployeeId());
         map.put("employeeName", emp.getEmployeeName());

         template.execute(sql,map,new PreparedStatementCallback<Object>() {  
                @Override  
                public Object doInPreparedStatement(PreparedStatement ps)  
                        throws SQLException, DataAccessException {  
                    return ps.executeUpdate();  
                }  
            });  


    }

    @Override
    public void deleteEmployee(Employee emp) {
         final String sql = "delete from employee where employeeId=:employeeId";


         Map<String,Object> map=new HashMap<String,Object>();  
         map.put("employeeId", emp.getEmployeeId());

         template.execute(sql,map,new PreparedStatementCallback<Object>() {  
                @Override  
                public Object doInPreparedStatement(PreparedStatement ps)  
                        throws SQLException, DataAccessException {  
                    return ps.executeUpdate();  
                }  
            });  


    }

}

А это мой контроллер

@RestController
@RequestMapping("/postgressApp")
public class ApplicationController {

    @Resource 
    EmployeeService employeeService;

    @GetMapping(value = "/employeeList")
    public List<Employee> getEmployees() {
        return employeeService.findAll();

    }

    @PostMapping(value = "/createEmp")
    public void createEmployee(@RequestBody Employee emp) {
         employeeService.insertEmployee(emp);

    }
    @PutMapping(value = "/updateEmp")
    public void updateEmployee(@RequestBody Employee emp) {
         employeeService.updateEmployee(emp);

    }
    @PutMapping(value = "/executeUpdateEmp")
    public void executeUpdateEmployee(@RequestBody Employee emp) {
         employeeService.executeUpdateEmployee(emp);

    }

    @DeleteMapping(value = "/deleteEmpById")
    public void deleteEmployee(@RequestBody Employee emp) {
         employeeService.deleteEmployee(emp);

    }


}

Должен ли яизменить мой код, чтобы обновить базу данных другим методом, например, репозиторием Crud?

1 Ответ

0 голосов
/ 08 ноября 2019

Обычно для живого приложения запросы HttpRequest от пользователей могут поступать в разных потоках. Итак, ваш ApplicationController будет вызываться из многих потоков. Вам не нужно много делать с многопоточностью самостоятельно.

Для имитации этого вы можете использовать службу executor для вызова различных методов ApplicationController из Runnables. Отправьте один исполняемый файл для каждой операции исполнителю.

Однако необходимо соблюдать осторожность, чтобы бизнес-логика допускала эту последовательность операций. Например, вы не можете обновить сотрудника до того, как он будет создан. Точно так же, после удаления сотрудника вы не можете обновить его / ее.

Или вы можете сделать его более упорядоченным, сделав так, чтобы каждый работающий работал только с одним сотрудником и выполнял последовательность операций последовательно.

Для работы со службой executor вы можете прочитать о submitTask, shutdownNow и awaitTermination: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

Более быстрое введение: http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

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