使用java ForkJoinPool调用JdbcTemplate batchUpdate()

问题描述 投票:0回答:1

我正在寻找一种最佳地更新大量行的方法,因为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 - 我也不确定如何在多线程环境中管理数据库连接

任何帮助,将不胜感激。

java multithreading jdbctemplate forkjoinpool
1个回答
0
投票

我想在你的代码中指出两件事。

  1. 看来jdbcTemplate对象在这里被所有线程共享。这实际上意味着共享相同的连接。我们不应该在多个线程中使用相同的连接。
  2. ForkJoinPool用于递归任务,您需要分出子任务并加入以完成它们。我不认为这是这种情况。如果需要使用多线程,请使用固定的线程池并使用连接池来获取每个线程中的连接。
© www.soinside.com 2019 - 2024. All rights reserved.