如何多线程更新由sql代码更新的数据库?

我已经制作了一个基本的CRUD spring-boot应用程序,该应用程序连接到Postgresql数据库。 我通过我的employeeDao中的sql代码访问数据库,该代码稍后在Controller中通过employeeService类调用。 现在,我必须使用多线程方法来更新数据库,但是我不知道如何实现。

我做了一个taskExecutor,但是我真的不知道如何使用它。

公共执行器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",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,emp.getEmployeeId());

         template.execute(sql,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存储库之类的另一种方法来更新数据库?

jyw114 回答:如何多线程更新由sql代码更新的数据库?

通常对于实时应用程序,来自用户的HttpRequest可以到达不同的线程。因此,您的ApplicationController将被许多线程调用。您无需为多线程做太多事情。

为进行模拟,可以使用执行程序服务从Runnables调用各种ApplicationController方法。将每个操作的一个可运行文件提交给执行者。

但是,您必须注意业务逻辑允许该操作顺序。例如,您不能在创建员工之前更新他/她。同样,删除员工后,您将无法更新他/她。

或者,您可以通过使每个可运行对象仅在一名员工上进行操作,并按顺序执行一系列操作,从而使操作更加有序。

要使用执行程序服务,您可能需要阅读有关commitTask,shutdownNow和awaitTermination的信息:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

更快速的介绍:http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

本文链接:https://www.f2er.com/3138612.html

大家都在问