Более быстрый способ записи элементов в mariadb, кроме jpaitemwriter - PullRequest
0 голосов
/ 16 января 2019

У меня есть пакетное задание, которое читает из базы данных Oracle и хранит JPA с JPA ITEM READER и пишет в MariaDB с JPA ITEM WRITER. Есть ли способ выполнить массовую вставку в MariaDB или выполнить массовое выполнение с помощью метода bulkoperations.execute () в mongodb?

Я использовал предоставленный 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 Ответ

0 голосов
/ 16 января 2019

Вы можете попробовать JdbcBatchItemWriter, который использует JdbcTemplate#batchUpdate за сценой. Обычно это быстрее пишущих элементов JPA, поскольку они не взаимодействуют с постоянным контекстом, кэшем первого / второго уровня и т. Д.

Надеюсь, это поможет.

...