我一直在寻找一种最佳地更新大量行的方法,因为orm操作被证明是缓慢的,最终我目前使用的解决方案是通过jdbc批更新将db更新包装在forkjoinpool任务中。使用ORM,更新db需要20秒,而使用这种方法则需要5秒)
ForkJoinPool customThreadPool = new ForkJoinPool(8);
try {
customThreadPool.submit(
() ->{
String query = "update tableX set name = ? ";
jdbcTemplate.batchUpdate(query, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
//compList is a list of ABC with 50,000+ elements
ABC abc = compList.get(i);
ps.setString(1, abc.getName());
}
@Override
public int getBatchSize() {
return compList.size();
}
});
}
).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
可以这样做吗?我已经看到了forkjoinpool示例,但是我不确定它将如何划分此特定的db操作任务。
我已经测试了数据库的更改,这是肯定的,但是对此我有一些疑问:
1-准备的不同批次是否在不同线程中运行?
2-我也不确定在多线程环境中如何管理数据库连接
任何帮助将不胜感激。
答案 0 :(得分:0)
我想指出代码中的两件事。
jdbcTemplate
对象在这里被所有线程共享。这实质上意味着共享相同的连接。我们不应在多个线程中使用相同的连接。 ForkJoinPool
用于递归任务,您需要派出子任务并加入以完成它们。我认为这里不是这样。如果需要使用多线程,请使用固定线程池并使用连接池在每个线程中获取连接。