我是春季批次新手。我已经使用inmemoryrepository配置了我的工作。但似乎仍然使用db来持久工作Metadeta。 我的春季批量配置是:
@Configuration 公共类BatchConfiguration {
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobBuilderFactory jobBuilder;
@Bean
public JobLauncher jobLauncher() throws Exception {
SimpleJobLauncher job =new SimpleJobLauncher();
job.setJobRepository(getJobRepo());
job.afterPropertiesSet();
return job;
}
@Bean
public PlatformTransactionManager getTransactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobRepository getJobRepo() throws Exception {
return new MapJobRepositoryFactoryBean(getTransactionManager()).getObject();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) throws Exception {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer).repository(getJobRepo())
.build();
}
@Bean
public Job job( @Qualifier("step1") Step step1) throws Exception {
return jobBuilder.get("myJob").start(step1).repository(getJobRepo()).build();
}
}
如何解决上述问题?
答案 0 :(得分:13)
如果您使用Sprint启动 application.properties中的一个简单属性将解决该问题 spring.batch.initialize-架构= ALWAYS
答案 1 :(得分:0)
在CentOS(大多数基于Unix的系统)中使用MySql数据库面临相同问题的人。
表名称在Linux中区分大小写。设置lower_case_table_names=1
已解决了问题。
查找正式文档here
答案 2 :(得分:0)
对于非 Spring Boot 设置:
@Bean
public DataSource mysqlDataSource() {
// create your application datasource here
}
@Bean
@Primary
public DataSource batchEmbeddedDatasource() {
// in memory datasource required by spring batch
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema-drop-h2.sql")
.addScript("classpath:schema-h2.sql")
.build();
}
初始化脚本可以在org.springframework.batch.core
包下的spring-batch-core-xxx.jar中找到。
注意我使用的是内存数据库,但解决方案也适用于其他数据库系统。