sqlCopy codeLOAD DATA INFILE 'data.csv' INTO TABLE employees FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( employee_id, first_name, last_name, email, hire_date DATE 'YYYY-MM-DD' ) WHEN (hire_date >= '2022-02-01')
将 select * from order_info order by id limit 5 offset 10 改写成 select * from order_info order by id limit 5 offset 3。偏移量10变成3,是基于10/3计算得出的。将语句在三个库分别执行,得到数据:
第二步:找最小值
第一个库:最小数据为8
第二个库:最小数据为11
第三个库:最小数据为12
因此,从三个库中拿到的最小数据为8。
第三步:第二次语句改写
这次需要把 select * from order_info order by id limit 5 offset 3 改写成一个between语句,起点是最小的OrderID,终点是原来每个分库各自返回数据的最大值:
第一个分库改写为: select * from order_info order by id where id between id_min and 22
第二个分库改写为: select * from order_info order by id where id between id_min and 23
第三个分库改写为: select * from order_info order by id where id between id_min and 24
@Bean("slaveTransferStudentItemReader") @StepScope public JdbcPagingItemReader<Student> slaveTransferStudentItemReader(@Value("#{stepExecutionContext[fromId]}")final Long fromId, @Value("#{stepExecutionContext[toId]}")final Long toId) {
MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); queryProvider.setSelectClause("student_id, name, address"); queryProvider.setFromClause("from student_source"); queryProvider.setWhereClause(String.format("where student_id > %s and student_id <= %s", fromId, toId));
Map<String, Order> sortKeys = new HashMap<>(1); sortKeys.put("student_id", Order.ASCENDING); queryProvider.setSortKeys(sortKeys);
@Override public Student process(final Student studentSource)throws Exception {
final Long studentId = studentSource.getStudentId(); final String name = studentSource.getName(); final String address = studentSource.getAddress();
final Student studentTarget = new Student(); studentTarget.setStudentId(studentId); studentTarget.setName(name.concat("_1")); studentTarget.setAddress(address);
log.info("Converting ({}) into ({})", studentSource, studentTarget);
@Override public Student process(final Student studentSource)throws Exception {
final Long studentId = studentSource.getStudentId(); final String name = studentSource.getName(); final String address = studentSource.getAddress();
final Student studentTarget = new Student(); studentTarget.setStudentId(studentId); studentTarget.setName(name.concat("_2")); studentTarget.setAddress(address);
log.info("Converting ({}) into ({})", studentSource, studentTarget);
@Override public Student process(final Student studentSource)throws Exception {
final Long studentId = studentSource.getStudentId(); final String name = studentSource.getName(); final String address = studentSource.getAddress();
final Student studentTarget = new Student(); studentTarget.setStudentId(studentId); studentTarget.setName(name); studentTarget.setAddress(address.concat("_8"));
log.info("Converting ({}) into ({})", studentSource, studentTarget);