Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 要使用默认的BatchConfigurer,上下文必须包含不超过一个数据源(找到2)_Mysql_Spring Boot_Db2_Spring Batch - Fatal编程技术网

Mysql 要使用默认的BatchConfigurer,上下文必须包含不超过一个数据源(找到2)

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 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.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所建议的,我还将把数据源的配置放在一个单独的文件中

除此之外,配置文件中还存在以下问题:

  • SpringBatch查找名为“datasource”的数据源(注意大写字母S)。如果找不到,它会查找找到的任何数据源。但是,如果它发现多个异常,它将抛出一个异常->您观察到的异常

  • 在配置文件中,创建两个数据源并注入一个(@Autowired Datasource dataSourceSecond)。这将导致下一个问题,因为您没有具有此名称的数据源。(您只定义了数据源“secondaryDataSource”和“primaryDataSource”)。这也会导致一个例外

  • 以下是我将如何组织我的配置

    @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;
        }
    
       ...