我有一个批处理作业,它使用复杂的选择查询和许多连接从数据源上的多个表中读取数据,并使用插入查询向另一个数据源上的表写入数据。
@Bean
public JdbcCursorItemReader<Employee> myReader2() {
JdbcCursorItemReader<Employee> reader = new JdbcCursorItemReader<>();
reader.setSql(COMPLICATED_QUERY_WITH_MANY_JOINS);
reader.setDataSource(dataSourceOne);
reader.setPreparedStatementSetter(new MyPrepStSetterOne());
reader.setRowMapper(new EmployeeRowMapper());
return reader;
}
Bean
public JdbcBatchItemWriter<Employee> myWriter2(DataSource dataSource) {
JdbcBatchItemWriter<Employee> writer = new JdbcBatchItemWriter<>();
writer.setSql(INSERT_QUERY);
writer.setPreparedStatementSetter(new MyPrepStSetterTwo());
writer.setDataSource(dataSourceTwo);
return writer;
}
我在一个步骤中有上述阅读器和写入器。如果今天的记录可以复制,我想删除从前一天的工作中插入的员工记录(不是全部)。
因此,我在上面的步骤之前添加了一个步骤,在阅读器中使用相同的选择查询,但在写入器中使用删除查询。
@Bean
public JdbcCursorItemReader<Employee> myReader1() {
JdbcCursorItemReader<Employee> reader = new JdbcCursorItemReader<>();
reader.setSql(COMPLICATED_QUERY_WITH_MANY_JOINS);
reader.setDataSource(dataSourceOne);
reader.setPreparedStatementSetter(new MyPrepStSetterOne());
reader.setRowMapper(new EmployeeRowMapper());
return reader;
}
Bean
public JdbcBatchItemWriter<Employee> myWriter1(DataSource dataSource) {
JdbcBatchItemWriter<Employee> writer = new JdbcBatchItemWriter<>();
writer.setSql(DELETE_QUERY_WHERE_EMPLOYEE_NAME_IS);
writer.setPreparedStatementSetter(new MyPrepStSetterZero());
writer.setDataSource(dataSourceTwo);
return writer;
}
我得到EmptyResultDataAccessException: 10的项目3没有更新任何行因为不是所有今天的记录都可能是昨天插入的。
我如何使myWriter1忽略,如果记录不存在,并继续下一步?
你的方法似乎是正确的。你可以将JdbcBatchItemWriter# setassertupupdates设置为false
,这应该忽略没有记录被你的查询更新的情况(根据你的描述,这是一个有效的业务案例)。