Вызов JdbcTemplate batchUpdate () с помощью Java ForkJoinPool - PullRequest
0 голосов
/ 22 апреля 2019

Я искал способ оптимального обновления большого количества строк, так как операции orm оказались медленными. В конце концов, решение, которое я использовал в настоящее время, заключается в том, чтобы обернуть обновление db через пакетное обновление 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 - Работают ли разные партии в разных нитях?

2 - Я также не уверен, как управление подключением к базе данных осуществляется в многопоточной среде

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 22 апреля 2019

В вашем коде есть две вещи, на которые я хотел бы обратить внимание.

  1. Кажется, jdbcTemplate объект является общим для всех потоков здесь. По сути это означает совместное использование одной и той же связи. Мы не должны использовать одно и то же соединение в нескольких потоках.
  2. ForkJoinPool предназначен для рекурсивных задач, где вам нужно раскошелиться на подзадачи и объединиться для их завершения. Я не думаю, что дело здесь. Если вам нужно использовать многопоточность, используйте фиксированный пул потоков и используйте пул соединений для захвата соединения в каждом потоке.
...