我有一个批处理作业,它读取和 Oracle 数据库,使用 JPA 项目读取器存储 JPA,并使用 JPA 项目编写器写入 MariaDB。有没有办法将批量插入到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秒...这似乎有点冗长。
有什么建议吗?
您可以尝试在幕后使用JdbcTemplate#batchUpdate
的JdbcBatchItemWriter
。这通常比 JPA 项目编写器更快,因为它不与持久上下文、一级/二级缓存等交互。
希望这有帮助。