我正在寻找一种最佳地更新大量行的方法,因为orm操作变得很慢,最终我目前使用的解决方案是通过fork_inpool任务中的jdbc批量更新来包装db更新。(使用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 - 我也不确定如何在多线程环境中管理数据库连接
任何帮助,将不胜感激。
我想在你的代码中指出两件事。
jdbcTemplate
对象在这里被所有线程共享。这实际上意味着共享相同的连接。我们不应该在多个线程中使用相同的连接。ForkJoinPool
用于递归任务,您需要分出子任务并加入以完成它们。我不认为这是这种情况。如果需要使用多线程,请使用固定的线程池并使用连接池来获取每个线程中的连接。