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