我使用spring batch来完成数据迁移工作。有很多数据,所以我决定使用JdbcPagingItemReader逐页读取数据。 下面是我定义阅读器的方法:
private JdbcPagingItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,
String tenant){
String tenantName = tenantHelper.determineTenant(tableName);
Map<String, Object> sqlParameterValues = new HashMap<>();
sqlParameterValues.put("tableName", tableName);
sqlParameterValues.put("tenantName", tenantName);
sqlParameterValues.put("tenant", tenant);
JdbcPagingItemReader<Map<String, Object>> itemReader = new JdbcPagingItemReader<>();
itemReader.setDataSource(dataSource);
itemReader.setPageSize(2);
itemReader.setFetchSize(2);
itemReader.setQueryProvider(generateSqlPagingQueryProvider(tableName,tenantName,tenant));
//itemReader.setParameterValues(sqlParameterValues);
itemReader.setRowMapper(new ColumnMapRowMapper());
try {
itemReader.afterPropertiesSet();
} catch (Exception e) {
e.printStackTrace();
}
return itemReader;
}
private PostgresPagingQueryProvider generateSqlPagingQueryProvider(String tableName, String tenantName,
String tenant) {
PostgresPagingQueryProvider provider = new PostgresPagingQueryProvider();
Map<String, Order> sortKeys = new LinkedHashMap<>();
String sortKey = getSortKeyBytable(tableName);
sortKeys.put(sortKey, Order.ASCENDING);
provider.setSelectClause("select *");
provider.setFromClause("from " + tableName);
provider.setWhereClause("where " + tenantName + " ='" + tenant + "'");
provider.setSortKeys(sortKeys);
return provider;
}
我指定的排序键是表中的主键,它是一个字符串。但是分页无法正常工作。但是它只读取所有数据就不会出错。
在spring batch文档中,它提供了一个使用int类型id作为排序键的示例,我想知道spring Batch分页只读是否支持int类型排序关键字?并且不支持字符串排序键吗?
这是春季批的限制吗?
答案 0 :(得分:1)
它不是弹簧批处理的限制。 这就是数据库的工作方式。 它根据字符串的ascii值对字符串进行排序。
答案 1 :(得分:0)
问题中的上面的代码确实可以解决我的内存问题,但之所以不起作用,是因为我仍在春季批处理步骤中调用Cursor Reader。这样分页阅读器可以解决内存问题