Очень медленно работает JPA в многопоточном варианте записи в БД
настройки проперти
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
jdbc:
batch_size: 50
naming-strategy: org.hibernate.cfg.EJB3NamingStrategy
my_basa:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL95Dialect
jdbc:
batch_size: 50
order_inserts: true
lob.non_contextual_creation: true
generate_statistics: true
task:
execution:
pool:
core-size: 100
max-size: 100
queue-capacity: 1000
keep-alive: 120s
await-termination: true
allow-core-thread-timeout: false
shutdown:
await-termination-period: 5m
thread-name-prefix: DiaSoftReplicatorThread-
разбиение коллекции на бачи и отправление каждого бача на запись в многопоточку
private void saveAllJdbcBatchCallable(List<MyDATA> source) {
try {
List<List< MyDATA >> partition = Lists.partition(source, batchSize);
List<Callable<Void>> callables = partition.stream().map(sublist ->
(Callable<Void>) () -> {
saveDataToBD(sublist);
return null;
}).collect(Collectors.toList());
taskExecutor.getThreadPoolExecutor().invokeAll(callables);
} catch (Exception e) {
}
}
метод записи в БД
public void saveDataToBD(List<MyDATA> source) {
myJpaRepository.saveAll(source);
}
вопрос в том, где то не верно настроена многопоточка или jpa в принципе не нуждается в многопоточке если используется batch_size.
Источник: Stack Overflow на русском