Pongamos como contexto, que se necesita leer desde una base de datos origen y grabar en otra base de datos distinta. Con el propósito de realizar resúmenes y cuadres diarios.
Lo más eficiente será no depender de algún ORM. Por lo que se recomienda emplear JDBC.
Spring-Batch provee un JdbcPagingItemReader el cual, al recuperar los registros de manera paginada no ocupará memoria en retener todo el resultado de la consulta.
También tenemos un JdbcBatchItemWriter para grabar los registros, que los grabarán usando la capacidad batch del driver.
TaskletStep getBuild(ItemReader<T> reader, ItemWriter<T> writer) { | |
return new StepBuilder(STEP_NAME, jobRepository) | |
.<T, T>chunk(1000, batchTransactionManager) | |
.reader(reader) | |
.writer(writer) | |
.faultTolerant() | |
.retryLimit(3) | |
.retry(Exception.class) | |
.taskExecutor(batchExecutor) | |
.build(); | |
} | |
Step read() throws Exception { | |
return getBuild(jdbcPagingItemReader(), jdbcBatchItemWriter()); | |
} |
@Bean | |
JdbcPagingItemReader<T> jdbcPagingItemReader() throws Exception { | |
var pagingItemReader = new JdbcPagingItemReaderBuilder<T>() | |
.name(READER_NAME) | |
.dataSource(swliDatasource) | |
.queryProvider(queryProvider()) | |
.parameterValues(parameterValues()) | |
.rowMapper(mapper) | |
.pageSize(1000) | |
.build(); | |
//pagingItemReader.afterPropertiesSet(); Using a Bean | |
return pagingItemReader; | |
} |
@Bean | |
JdbcBatchItemWriter<T> jdbcBatchItemWriter() { | |
JdbcBatchItemWriter<T> writer = new JdbcBatchItemWriter<>(); | |
writer.setDataSource(pmmDatasource); | |
writer.setSql(INSERT_TABLE); | |
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); | |
//writer.afterPropertiesSet(); Using a Bean | |
return writer; | |
} |
Documentación
https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database
https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability
Top comments (0)