【问题标题】:Springbatch is unable to detect database type for mysqlSpring Batch 无法检测 mysql 的数据库类型
【发布时间】:2022-06-21 23:17:39
【问题描述】:

我正在使用带有 mysql 的 springboot 2.6.6,并且对 springbatch 很陌生。当我将数据源保存在读取器和写入器保存在 SampleJob.java 中的同一个配置文件中时,我收到一个错误“弹簧上下文正在形成一个循环”。建议的解决方案是将数据源放在另一个类中,因此我将数据源放在与 main() 相同的类中。 现在我遇到了这个问题:

错误

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.batch.BatchDataSourceScriptDatabaseInitializer]: Factory method 'batchDataSourceInitializer' threw exception; nested exception is java.lang.IllegalStateException: Unable to detect database type
Caused by: java.lang.IllegalStateException: Unable to detect database type

SampleJob.java

@Configuration
public class SampleJob {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;
            

    @Bean
    public Job chunkJob() {
        return jobBuilderFactory.get("Chunk Job")
                .incrementer(new RunIdIncrementer())
                .start(firstChunkStep())
                .build();
    }
    
    

    private Step firstChunkStep() {
        return stepBuilderFactory.get("First Chunk Step")
                .<StudentJdbc, StudentJdbc>chunk(3)
                  .reader(jdbcItemReader())
                  
                .writer(flatFileItemWriter(null))
                .build();
    }

    
    @Bean
    @StepScope
    public JdbcCursorItemReader<StudentJdbc> jdbcItemReader(){

        JdbcCursorItemReader<StudentJdbc> jdbcReader = new JdbcCursorItemReader<StudentJdbc>();
        jdbcReader.setSql("select id, first_name as firstName, last_name as lastName, email from students");
        
        jdbcReader.setDataSource(universitydatasource());
        jdbcReader.setRowMapper(new BeanPropertyRowMapper<StudentJdbc>() {
            {
                setMappedClass(StudentJdbc.class);
            }
        });
    
        return jdbcReader;
    }
    

    @StepScope
    @Bean
    public FlatFileItemWriter<StudentJdbc> flatFileItemWriter(
            @Value("#{jobParameters['outputFile']}") FileSystemResource fileSystemResource
    ){
        FlatFileItemWriter<StudentJdbc> flatFileItemWriter = new FlatFileItemWriter<StudentJdbc>();
        flatFileItemWriter.setResource(fileSystemResource);
        
        flatFileItemWriter.setResource(fileSystemResource);
        
        flatFileItemWriter.setHeaderCallback(new FlatFileHeaderCallback() {
            
            @Override
            public void writeHeader(Writer writer) throws IOException {
                writer.write("Id, First Name, Last Name, Email");
            }
        });
            
        flatFileItemWriter.setLineAggregator(new DelimitedLineAggregator(){
            {
                setFieldExtractor(new BeanWrapperFieldExtractor<StudentResponse>() {
                    {
                        setNames(new String[] {"id","firstName","lastName","email"});
                    }
                    
                });
            }
        });
        
        flatFileItemWriter.setFooterCallback(new FlatFileFooterCallback() {
            
            @Override
            public void writeFooter(Writer writer) throws IOException {
                writer.write("Created @ "+new Date());
            }
        }); 
        
        return flatFileItemWriter;
    }
}

主类文件

@SpringBootApplication
@EnableBatchProcessing
public class ChunksApplication {

    public static void main(String[] args) {
        SpringApplication.run(ChunksApplication.class, args);
    }

    @Bean
    @Primary    
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource datasource() {
        return DataSourceBuilder.create().build();
    }
    
    
    @Bean
    @ConfigurationProperties(prefix="spring.universitydatasource")
    public DataSource universitydatasource() {
        return DataSourceBuilder.create().build();
    }
}

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/udemy-springbatch-chunks
spring.datasource.username=____
spring.datasource.password=____
spring.datasource.platform=mysql
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver


#alternate datasource for db input for reader
spring.universitydatasource.url=jdbc:mysql://localhost:3306/university?createDatabaseIfNotExist=true
spring.universitydatasource.username=____
spring.universitydatasource.password=____
spring.universitydatasource.platform=mysql
spring.universitydatasource.driverClassName=com.mysql.cj.jdbc.Driver

【问题讨论】:

    标签: java spring-boot spring-batch datasource


    【解决方案1】:

    找到了解决办法。 @ConfigurationProperties 似乎没有从 application.properties 中获取 url、用户名和密码,所以这在主类文件本身中起作用:

    @Bean
    @Primary    
    public DataSource datasource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url("jdbc:mysql://localhost:3306/udemy-springbatch-chunks");
        dataSourceBuilder.username("____");
        dataSourceBuilder.password("____");
        return dataSourceBuilder.build();
    }
    
    
    @Bean("universityDatasource")
    public DataSource universitydatasource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url("jdbc:mysql://localhost:3306/university?createDatabaseIfNotExist=true");
        dataSourceBuilder.username("____");
        dataSourceBuilder.password("____");
        return dataSourceBuilder.build();
    }
    

    【讨论】:

      【解决方案2】:

      对我有用

      spring.batch.schema=classpath:org/springframework/batch/core/schema-mysql.sql

      【讨论】:

        【解决方案3】:

        我的解决方案是这样的,你必须添加 jdbcUrl

        属性文件示例:

        spring.datasource.url=jdbc:mysql://localhost:3306/udemy-springbatch-chunks
        spring.datasource.jdbcUrl=${spring.datasource.url}
        spring.datasource.username=____
        spring.datasource.password=____
        spring.datasource.platform=mysql
        spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
        
        
        #alternate datasource for db input for reader
        
        spring.universitydatasource.url=jdbc:mysql://localhost:3306/university
        spring.universitydatasource.jdbcUrl=${spring.universitydatasource.url}
        spring.universitydatasource.username=____
        spring.universitydatasource.password=____
        spring.universitydatasource.platform=mysql
        spring.universitydatasource.driverClassName=com.mysql.cj.jdbc.Driver
        

        问候。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-22
          • 2017-07-30
          • 1970-01-01
          • 1970-01-01
          • 2012-04-12
          • 2023-01-16
          • 2020-11-10
          • 2020-07-19
          相关资源
          最近更新 更多