Mysql 要使用默认的BatchConfigurer,上下文必须包含不超过一个数据源(找到2)
我使用的是spring boot和spring batch。对于元表,我希望使用mysql,对于所有业务,我希望使用db2作为数据库 应用程序属性Mysql 要使用默认的BatchConfigurer,上下文必须包含不超过一个数据源(找到2),mysql,spring-boot,db2,spring-batch,Mysql,Spring Boot,Db2,Spring Batch,我使用的是spring boot和spring batch。对于元表,我希望使用mysql,对于所有业务,我希望使用db2作为数据库 应用程序属性 spring.datasource.url = jdbc:mysql://localhost:3306/local spring.datasource.username = root spring.datasource.password = root spring.jpa.show-sql = true spring.jpa.hibernate.dd
spring.datasource.url = jdbc:mysql://localhost:3306/local
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.seconddatasource.url=jdbc:db2://***************
spring.seconddatasource.username=******
spring.seconddatasource.password=****
spring.seconddatasource.driverClassName=com.ibm.db2.jcc.DB2Driver
BatchCongig.java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSourceSecond;
@Bean
@ConfigurationProperties(prefix="spring.seconddatasource")
public javax.sql.DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public javax.sql.DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcCursorItemReader<User> reader()
{
JdbcCursorItemReader<User> reader=new JdbcCursorItemReader<>();
reader.setDataSource(dataSourceSecond);
reader.setSql("Select ACCT_ID from ACCT_table FETCH FIRST 100 ROWS ONLY");
reader.setRowMapper(new UserRowerMapper());
return reader;
}
@Bean
public UserItemProcessor processor()
{
return new UserItemProcessor();
}
@Bean
public Step step1()
{
return stepBuilderFactory.get("step1").<User,User>chunk(10)
.reader(reader())
.processor(processor())
.build();
}
@Bean
public Job job1()
{
return jobBuilderFactory.get("jobakjkkj")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
}
我发现一个jira说“@Primary datasource with@EnableBatchProcessing不适用于使用多个数据源”。如果这是正确的,请告诉我如何实现同样的效果。
我也发现这一点,但对我的情况没有帮助。正如M.Deinum所建议的,我还将把数据源的配置放在一个单独的文件中 除此之外,配置文件中还存在以下问题:
@Configuration
public DatasourceConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.seconddatasource")
public javax.sql.DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
// note the new name: dataSource -> this is the name springBatch is looking for
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public javax.sql.DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@Configuration
@EnableBatchProcessing
@Import(DatasourceConfiguration.class)
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
// note the name
@Autowired
public DataSource secondaryDataSource;
@Bean
public JdbcCursorItemReader<User> reader()
{
JdbcCursorItemReader<User> reader=new JdbcCursorItemReader<>();
// note the name
reader.setDataSource(secondaryDataSource);
reader.setSql("Select ACCT_ID from ACCT_table FETCH FIRST 100 ROWS ONLY");
reader.setRowMapper(new UserRowerMapper());
return reader;
}
...
@配置
公共数据源配置{
@豆子
@ConfigurationProperties(前缀=“spring.seconddatasource”)
public javax.sql.DataSource secondaryDataSource(){
返回DataSourceBuilder.create().build();
}
//注意新名称:dataSource->这是springBatch正在寻找的名称
@豆子
@ConfigurationProperties(前缀=“spring.datasource”)
public javax.sql.DataSource DataSource(){
返回DataSourceBuilder.create().build();
}
}
@配置
@启用批处理
@导入(DatasourceConfiguration.class)
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
//记下名字
@自动连线
公共数据源第二数据源;
@豆子
公共JdbcCursorItemReader()
{
JdbcCursorItemReader=新的JdbcCursorItemReader();
//记下名字
reader.setDataSource(secondaryDataSource);
setSql(“从ACCT_表中选择ACCT_ID,仅获取前100行”);
setRowMapper(新的UserRowerMapper());
返回读取器;
}
...
我还为一个类似的问题写了一个更为深思熟虑的答案:
首先,我建议为批处理基础结构创建2个配置1,另一个配置仅包含作业配置(步骤等)。批处理配置应配置批处理infra本身,而不是依赖默认配置的批处理。为此,请自行实现
BatchConfigurer
并禁用批处理自动配置(您可以尝试删除@enableBackProcessing
,然后查看Spring Boot如何处理自动配置(而不是普通的Spring批处理)。感谢您的回复@M.Deinum,很抱歉,我对Spring引导和批处理是新手。如果您能更详细地描述,这将对我有所帮助,或者如果您能提供一个示例,请提前感谢:)最短的,删除@EnableBatchProcessing
,看看会发生什么。如果这不起作用,请按说明操作,将配置拆分为2,然后让基础结构配置实现BatchConfigurer
。
@Configuration
public DatasourceConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.seconddatasource")
public javax.sql.DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
// note the new name: dataSource -> this is the name springBatch is looking for
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public javax.sql.DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@Configuration
@EnableBatchProcessing
@Import(DatasourceConfiguration.class)
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
// note the name
@Autowired
public DataSource secondaryDataSource;
@Bean
public JdbcCursorItemReader<User> reader()
{
JdbcCursorItemReader<User> reader=new JdbcCursorItemReader<>();
// note the name
reader.setDataSource(secondaryDataSource);
reader.setSql("Select ACCT_ID from ACCT_table FETCH FIRST 100 ROWS ONLY");
reader.setRowMapper(new UserRowerMapper());
return reader;
}
...