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

时间:2011-09-22 08:05:54

标签: java sql multithreading jdbc jdbctemplate

我正在更新数据库中的多条记录。现在,只要UI发送要更新的记录列表,我就必须更新数据库中的那些记录。我正在使用JDBC模板。

早期案例

早在我从UI获取记录时我就是这样,我只是做

jdbcTemplate.batchUpdate(Query, List<object[]> params)

每当有异常时,我就会回滚整个事务。

更新:batchUpdate是多线程还是以某种方式比批量更新更快?)

后期案例

但后来随着异常情况需求发生变化。因此,只要有异常,我就应该知道哪些记录无法更新。因此,如果出现异常,我必须将记录发送回UI,原因是他们为什么失败了。

所以我不得不做类似的事情:

for(Record record : RecordList)
{
   try{
       jdbcTemplate.update(sql, Object[] param)
   }catch(Exception ex){
       record.setReason("Exception : "+ex.getMessage());
       continue;
   }
}

我是通过使用循环以正确的方式做到这一点吗?

如果是,有人可以建议我如何使其多线程。 或者在这种情况下有什么不对。 说实话,我犹豫在循环中使用try catch块:(。

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

2 个答案:

答案 0 :(得分:1)

您的案例看起来需要在java中使用验证并单独筛选出有效数据并发送到数据库进行更新。

BO layer
-> filter out the Valid Record.
-> Invalid Record should be send back with some validation text.

In DAO layer
-> batch update your RecordList

这将为您提供最佳性能。

绝不要将数据库插入异常用作验证机制。

  1. 由于必须创建堆栈跟踪,因此例外代价很高
  2. 与数据库的连接是另一个代价高昂的过程,需要时间才能建立连接
  3. Java If-Else对于相同的数据库验证运行速度要快得多

答案 1 :(得分:1)

对Collection Callable&lt;&gt;进行所有更新操作, 将它发送到java.util.concurrent.ThreadPoolExecutor。游泳池是多线程的。

make Callable:

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