Более быстрый способ записи элементов в mariadb, кроме jpaitemwriter
У меня есть пакетное задание, которое читает из базы данных Oracle и хранит JPA с JPA ITEM READER и пишет в MariaDB с JPA ITEM WRITER. Есть ли способ выполнить массовую вставку в MariaDB или выполнить массовое выполнение, используя mongodb метод bulkoperations.execute()?
Я использовал предоставленный JpaItemWriter следующим образом:
@Bean
@Transactional
public JpaItemWriter<entity.maria.class> classJpaItemWriter() {
JpaItemWriter<entity.maria.class> writer = new JpaItemWriter<>();
writer.setEntityManagerFactory(mariaEntityManager.getObject());
return writer;
}
Читатель это:
public JpaPagingItemReader<PojoClass> classJpaReader() throws Exception {
String jpqlQuery = "SELECT t FROM PojoClass t where rownum < 15001";
JpaPagingItemReader<PojoClass> reader = new JpaPagingItemReader<>();
reader.setQueryString(jpqlQuery);
reader.setEntityManagerFactory(oracleEntityManager.getObject());
reader.setPageSize(100000);
reader.afterPropertiesSet();
reader.setSaveState(true);
return reader;
}
Конфигурация шага:
@Bean
public Step classStep() throws Exception {
Step auditStep = stepBuilderFactory.get(
"entity.oracle.PojoClass").<class, entity.maria.class>chunk(
10000)
.reader(classJpaReader())
.writer(classJpaItemWriter())
.transactionManager(mariaTransactionManager)
.listener(auditWriterListener())
.faultTolerant()
.skipLimit(10000)
.skip(Exception.class)
.build();
return auditStep;
}
Я хотел бы сделать собственный писатель, который будет массово вставлять значения в mariaDb и хотел бы, чтобы время для вставки / вставки уменьшилось. В настоящее время время, необходимое для вставки 15000, составляет 326 секунд... Это кажется довольно продолжительным.
Какие-либо предложения?
1 ответ
Вы можете попробовать JdbcBatchItemWriter
который использует JdbcTemplate#batchUpdate
за кулисами. Обычно это быстрее пишущих элементов JPA, поскольку они не взаимодействуют с постоянным контекстом, кэшем первого / второго уровня и т. Д.
Надеюсь это поможет.