gpt4 book ai didi

java - 使用 java ForkJoinPool 调用 JdbcTemplate batchUpdate()

转载 作者:行者123 更新时间:2023-12-02 06:25:09 26 4
gpt4 key购买 nike

我一直在寻找一种最佳方式更新大量行的方法,因为 orm 操作速度很慢,最终我当前使用的解决方案是通过 jdbc 批量更新将数据库更新包装在 forkjoinpool 任务中。(使用 ORM 在数据库中更新需要 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 示例,但是我不确定它将如何划分这个特定的数据库操作任务。

我已经测试了数据库更改,结果是肯定的,但我对此有一些疑问:

1 - Are the different batches prepared operated in different threads ?

2 - I am also unsure how the db connection is managed in the multi-threaded environment

如有任何帮助,我们将不胜感激。

最佳答案

我想指出您的代码中有两件事。

  1. 看来jdbcTemplate对象被这里的所有线程共享。这本质上意味着共享相同的连接。我们不应该在多个线程中使用同一个连接。
  2. ForkJoinPool 适用于递归任务,您需要 fork 出子任务并加入它们才能完成。我认为这里的情况并非如此。如果需要使用多线程,请使用固定的线程池,并使用连接池在每个线程中抓取连接。

关于java - 使用 java ForkJoinPool 调用 JdbcTemplate batchUpdate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55793543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com