Spring Batch JdbcPagingItemReader分页不起作用

时间:2019-03-27 03:57:14

标签: java spring-batch

我使用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类型排序关键字?并且不支持字符串排序键吗?

这是春季批的限制吗?

2 个答案:

答案 0 :(得分:1)

它不是弹簧批处理的限制。 这就是数据库的工作方式。 它根据字符串的ascii值对字符串进行排序。

答案 1 :(得分:0)

问题中的上面的代码确实可以解决我的内存问题,但之所以不起作用,是因为我仍在春季批处理步骤中调用Cursor Reader。这样分页阅读器可以解决内存问题