我正在更新数据库中的多条记录。现在,只要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块:(。
请纠正我,真的需要学习更好的方法,因为我自己觉得,必须有更好的方法,谢谢。
答案 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 :(得分: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