We are changing our spring batch application to multiple data source so that metadata tables can go to H2 database(Avoid operational purging effort and improve performance) and business tables will be in oracle DB. After changing this, CompositeWriter transaction is partially committing as we have 3 tables in CompositeWriter. Ist table committed and 2nd table error thrown but rollback not happening for Ist table. This is working fine in default single data source . This question is related to transaction management of multiple datasources in spring batch having composite writer.
######### SPRING BATCH H2 DATASOUCRE Batch MetData ######
springbatch.datasource.driver-class-name=org.h2.Driver
springbatch.datasource.url=jdbc:h2:file:C:/IDE/jan
springbatch.datasource.username=ngecom
springbatch.datasource.password=ngecom
springbatch.datasource.configuration.connection-timeout=600000
springbatch.datasource.configuration.minimum-idle=5
springbatch.datasource.configuration.maximum-pool-size=50
springbatch.datasource.configuration.idle-timeout=600000
springbatch.datasource.configuration.max-lifetime=1800000
springbatch.datasource.configuration.auto-commit=true
springbatch.datasource.configuration.poolName=SpringBoot-HikariCPPrimary
springbatch.datasource.configuration.leak-detection-threshold=0
########JDBC Oracle Datasource########
#connection timeout 10 min
app.datasource.username=ngbilling
app.datasource.url=ourDBServer
app.datasource.driver-class-name=oracle.jdbc.OracleDriver
app.datasource.configuration.connection-timeout=600000
app.datasource.configuration.minimum-idle=5
app.datasource.configuration.maximum-pool-size=50
app.datasource.configuration.idle-timeout=600000
app.datasource.configuration.max-lifetime=1800000
app.datasource.configuration.auto-commit=true
app.datasource.configuration.poolName=SpringBoot-HikariCPSecodary
app.datasource.configuration.leak-detection-threshold=0
@Configuration
public class DataSourceRepository {
@Bean
@Primary
@ConfigurationProperties(prefix = "springbatch.datasource")
public DataSourceProperties springBatchDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = {"dataSourceSpringBatch"})
@Primary
@ConfigurationProperties("springbatch.datasource.configuration")
public HikariDataSource springBatchDataSource() {
return springBatchDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties(prefix = "app.datasource")
public DataSourceProperties appDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = {"bscsDataSource"})
@ConfigurationProperties("app.datasource.configuration")
public HikariDataSource appDataSource() {
return appDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean(name = "bscsJDBCTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("bscsDataSource") DataSource bscsDataSource) {
return new JdbcTemplate(bscsDataSource);
}
@Bean
public CompositeItemWriter compositeWriter() throws Exception {
CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
List<ItemWriter> writers = new ArrayList<ItemWriter>();
writers.add(summaryWriter());
writers.add(detailsWriter());
writers.add(chartWriter());
compositeItemWriter.setDelegates(writers);
return compositeItemWriter;
}
@Bean
public JdbcBatchItemWriter<UnifiedInvoiceDTO> summaryWriter() {
JdbcBatchItemWriter<UnifiedInvoiceDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
databaseItemWriter.setDataSource(dataSource);
databaseItemWriter.setSql(BSCSUtils.QUERY_INSERT_UBI_SUMMARY);
ItemPreparedStatementSetter<UnifiedInvoiceDTO> invoicePreparedStatementSetter = new InvoiceSummarySetter();
databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
return databaseItemWriter;
}
@Bean
public Step slaveStep() throws Exception {
return stepBuilderFactory.get("slaveStep").<UnifiedInvoiceDTO, UnifiedInvoiceDTO>chunk(chunkSize)
.reader(xmlItemReader(null)).processor(xmlFileItemProcessor()).writer(compositeWriter()).faultTolerant()
.skipLimit(skipErrorCount).skip(Exception.class).noSkip(FileNotFoundException.class)
.listener(itemSkipListener()).build();
}
@Component
public class BatchJobScheduler extends BasicBatchConfigurer {
protected BatchJobScheduler(BatchProperties properties, DataSource dataSource,
TransactionManagerCustomizers transactionManagerCustomizers) {
super(properties, dataSource, transactionManagerCustomizers);
// TODO Auto-generated constructor stub
}}