【问题标题】:Spring batch --- DatabaseType not found for product name: [Informix Dynamic Server]Spring batch --- 找不到产品名称的 DatabaseType:[Informix Dynamic Server]
【发布时间】:2016-04-09 22:35:41
【问题描述】:

我想用 Spring boot 实现 Spring Batch,因为我们使用的是 informix 数据库,所以当我的 spring boot 应用程序启动时,我遇到了以下异常。

配置:

@Bean
public DataSource dataSource() throws SQLException {
   BasicDataSource dataSource = new BasicDataSource();
   dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
    dataSource.setUrl(dataSourceProperties.getDbUrl());
    dataSource.setUsername(dataSourceProperties.getDbUsername());
    dataSource.setPassword(dataSourceProperties.getDbPassword())
    return dataSource;
}


@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){

    DataSourceTransactionManager manager=new DataSourceTransactionManager(dataSource);
    return manager;
}

@Bean
public JobRepositoryFactoryBean jobRepositoryFactoryBean( DataSourceTransactionManager txManager,DataSource dataSource ) throws Exception{

    JobRepositoryFactoryBean job=new JobRepositoryFactoryBean();
    job.setDataSource(dataSource);
    job.setDatabaseType("oracle");
    job.setTransactionManager(txManager);
    job.afterPropertiesSet();
    return job;
}


@Bean
public ItemReader<Person> reader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
    reader.setResource(new ClassPathResource("sample-data.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "firstName", "lastName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    return reader;
}

@Bean
public ItemProcessor<Person, Person> processor() {
    return new PersonItemProcessor();
}

@Bean
public ItemWriter<Person> writer(DataSource dataSource) {
    JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
    writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
    writer.setDataSource(dataSource);
    writer.afterPropertiesSet();
    return writer;
}

@Bean
public Job importUserJob(JobBuilderFactory jobs, Step s1, JobExecutionListener listener,JobRepositoryFactoryBean jobRepositoryFactoryBean) throws Exception {


    return jobs.get("importUserJob")
             .repository(jobRepositoryFactoryBean.getObject())
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(s1)
            .end()
            .build();
}

@Bean
public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Person> reader,
        ItemWriter<Person> writer, ItemProcessor<Person, Person> processor) {
    return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader)
            .processor(processor)
            .writer(writer)
            .build();
}

例外

原因:java.lang.IllegalArgumentException:找不到产品名称的 DatabaseType:[Informix Dynamic Server] 在 org.springframework.batch.support.DatabaseType.fromProductName(DatabaseType.java:79) 在 org.springframework.batch.support.DatabaseType.fromMetaData(DatabaseType.java:110) 在 org.springframework.boot.autoconfigure.batch.BatchDatabaseInitializer.getDatabaseType(BatchDatabaseInitializer.java:71) 在 org.springframework.boot.autoconfigure.batch.BatchDatabaseInitializer.initialize(BatchDatabaseInitializer.java:50) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:349) 在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:300) 在 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)

【问题讨论】:

标签: spring-boot spring-batch


【解决方案1】:

Spring Batch 似乎不直接支持 Informix。

来自org.springframework.batch.support.DatabaseType

DERBY("Apache Derby"), 
DB2("DB2"), 
DB2ZOS("DB2ZOS"), 
HSQL("HSQL Database Engine"),
SQLSERVER("Microsoft SQL Server"),
MYSQL("MySQL"),
ORACLE("Oracle"),
POSTGRES("PostgreSQL"),
SYBASE("Sybase"), H2("H2");

但是,正如这里所说:http://forum.spring.io/forum/spring-projects/batch/61097-why-spring-batch-doesn-t-support-informix-database,您似乎可以将数据库类型设置为 Oracle,它将支持 Informix。

【讨论】:

  • 你能写出如何将数据库类型设置为Oracle吗?您提供的链接已失效
  • @KrzysztofKrasoń 问题中有一个例子:job.setDatabaseType("oracle");
猜你喜欢
  • 2019-08-09
  • 2021-11-09
  • 2017-01-29
  • 2019-06-15
  • 2023-03-14
  • 1970-01-01
  • 2019-06-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多