使用Java ForkJoinPool调用JdbcTemplate batchUpdate()

时间:2019-04-22 11:19:08

标签: java multithreading jdbctemplate forkjoinpool

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

  1. 似乎jdbcTemplate对象在这里被所有线程共享。这实质上意味着共享相同的连接。我们不应在多个线程中使用相同的连接。
  2. ForkJoinPool用于递归任务,您需要派出子任务并加入以完成它们。我认为这里不是这样。如果需要使用多线程,请使用固定线程池并使用连接池在每个线程中获取连接。