spring batch 读写怎么配置多个数据源
时间: 2023-12-27 11:04:11 浏览: 253
要配置多个数据源,可以按照以下步骤进行:
1. 在配置类中,创建多个数据源的 Bean 对象。
2. 针对每个数据源,创建对应的事务管理器和作业库。
3. 配置 JobLauncher,指定使用哪个事务管理器和作业库。
4. 配置 ItemReader 和 ItemWriter,分别指定使用哪个数据源。
5. 在 Job 中,配置 Step,指定使用哪个 ItemReader 和 ItemWriter。
以下是一个简单的示例代码:
```java
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
@ConfigurationProperties(prefix = "datasource1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "datasource2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
@Bean
public PlatformTransactionManager transactionManager1() {
return new DataSourceTransactionManager(dataSource1());
}
@Bean
public PlatformTransactionManager transactionManager2() {
return new DataSourceTransactionManager(dataSource2());
}
@Bean
public JobRepository jobRepository1() throws Exception {
JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
jobRepositoryFactoryBean.setDataSource(dataSource1());
jobRepositoryFactoryBean.setTransactionManager(transactionManager1());
jobRepositoryFactoryBean.afterPropertiesSet();
return jobRepositoryFactoryBean.getObject();
}
@Bean
public JobRepository jobRepository2() throws Exception {
JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
jobRepositoryFactoryBean.setDataSource(dataSource2());
jobRepositoryFactoryBean.setTransactionManager(transactionManager2());
jobRepositoryFactoryBean.afterPropertiesSet();
return jobRepositoryFactoryBean.getObject();
}
@Bean
public JobLauncher jobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository1());
jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
return jobLauncher;
}
@Bean
public ItemReader<MyObject> reader1() throws Exception {
JdbcCursorItemReader<MyObject> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource1());
// ...
return reader;
}
@Bean
public ItemWriter<MyObject> writer1() throws Exception {
JdbcBatchItemWriter<MyObject> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource1());
// ...
return writer;
}
@Bean
public ItemReader<MyObject> reader2() throws Exception {
JdbcCursorItemReader<MyObject> reader = new JdbcCursorItemReader<>();
reader.setDataSource(dataSource2());
// ...
return reader;
}
@Bean
public ItemWriter<MyObject> writer2() throws Exception {
JdbcBatchItemWriter<MyObject> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource2());
// ...
return writer;
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory.get("step1")
.<MyObject, MyObject>chunk(10)
.reader(reader1())
.writer(writer1())
.transactionManager(transactionManager1())
.build();
}
@Bean
public Step step2() throws Exception {
return stepBuilderFactory.get("step2")
.<MyObject, MyObject>chunk(10)
.reader(reader2())
.writer(writer2())
.transactionManager(transactionManager2())
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.start(step1())
.next(step2())
.build();
}
}
```
在上述代码中,我们使用了两个数据源(dataSource1 和 dataSource2),分别对应两个事务管理器(transactionManager1 和 transactionManager2),以及两个作业库(jobRepository1 和 jobRepository2)。配置 JobLauncher 时,我们指定了使用 jobRepository1 作为 Job 的作业库。在配置 ItemReader 和 ItemWriter 时,我们分别指定了使用哪个数据源。在 Job 中,我们配置了两个 Step,分别使用不同的 ItemReader 和 ItemWriter,并指定了使用哪个事务管理器。
阅读全文