1

我正在更新数据库中的多条记录。现在,每当 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 块:(。

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

4

2 回答 2

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 将运行得更快
于 2011-09-22T08:17:27.230 回答
1

对 Collection Callable<> 进行所有更新操作,将其发送到 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
于 2011-09-22T08:31:34.473 回答