在java中以多线程方式插入或更新数据库中的多条记录

在java中以多线程方式插入或更新数据库中的多条记录,java,sql,multithreading,jdbc,jdbctemplate,Java,Sql,Multithreading,Jdbc,Jdbctemplate,我正在更新数据库中的多个记录。现在,每当UI发送要更新的记录列表时,我必须更新数据库中的记录。为此,我使用JDBC模板 早期案例 早些时候,每当我从UI中获取记录时,我都会这样做 jdbcTemplate.batchUpdate(Query, List<object[]> params) 那么,我是否以正确的方式,通过使用循环来实现这一点 如果是,有人可以建议我如何使它多线程。 或者这件事有什么不对劲吗。 事实上,我对在循环中使用try-catch块犹豫不决:( 请纠正我,我真的需

我正在更新数据库中的多个记录。现在,每当UI发送要更新的记录列表时,我必须更新数据库中的记录。为此,我使用JDBC模板

早期案例

早些时候,每当我从UI中获取记录时,我都会这样做

jdbcTemplate.batchUpdate(Query, List<object[]> params)
那么,我是否以正确的方式,通过使用循环来实现这一点

如果是,有人可以建议我如何使它多线程。 或者这件事有什么不对劲吗。 事实上,我对在循环中使用try-catch块犹豫不决:(


请纠正我,我真的需要学习一种更好的方法,因为我自己觉得,一定有更好的方法,谢谢。

您的案例看起来需要使用java验证并单独过滤出有效数据,然后发送到数据库进行更新

波层
->筛选出有效记录。
->应将无效记录与一些验证文本一起发回

在DAO层中
->批量更新您的记录列表

这将给你最好的表现

切勿将数据库插入异常用作验证机制

  • 异常代价高昂,因为必须创建堆栈跟踪
  • 连接到数据库是另一个代价高昂的过程,需要时间才能获得连接
  • 对于相同的数据库验证,Java If-Else将运行得更快

  • 使集合的所有更新操作都可调用, 将其发送到java.util.concurrent.ThreadPoolExecutor。该池是多线程的

    使可调用:

    class UpdateTask implements Callable<Exception> {
      //constructor with jdbctemplate,sql,param goes here.
      @Override
        public Exception call() throws Exception {
            try{
                  jdbcTemplate.update(sql, Object[] param)
                }catch(Exception ex){
                       return ex;
               }
    
            return null;
        }
    
    <T> List<Future<T>> java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
    
    类UpdateTask实现可调用{
    //带有jdbctemplate、sql、param的构造函数出现在这里。
    @凌驾
    公共异常调用()引发异常{
    试一试{
    jdbcTemplate.update(sql,对象[]参数)
    }捕获(例外情况除外){
    退换货;
    }
    返回null;
    }
    
    调用调用:

    class UpdateTask implements Callable<Exception> {
      //constructor with jdbctemplate,sql,param goes here.
      @Override
        public Exception call() throws Exception {
            try{
                  jdbcTemplate.update(sql, Object[] param)
                }catch(Exception ex){
                       return ex;
               }
    
            return null;
        }
    
    <T> List<Future<T>> java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
    

    列出java.util.concurrent.ExecutorService.invokeAll(收集代替在单独的线程中对同一行进行批量更新,为什么不尝试在线程之间以不冲突的方式分割工作?是的,我同意你的所有观点,但我的朋友,我没有验证逻辑。例外情况是我们无法考虑代码可能失败的情况。谢谢但是,不适用于我的情况。@kinshuk4 1我将尝试在验证中捕获最大的已知问题。然后,我将期望未知原因出现异常,这是我们无法预测的。对于您的情况,您可以做一件事,您可以让两个实现在异常上
    。但不确定代码审阅团队是否对逻辑感到满意