Spring Batch JdbcPagingItemReader подкачка не работает - PullRequest
0 голосов
/ 27 марта 2019

Я использую 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;
}

ключ сортировки, который я указал, является первичным ключом в таблице, это строка. Но пейджинг не работает, как ожидалось. Но он не выдает ошибки, он просто читает все данные.

В документе с пакетной пружиной приведен пример, в котором в качестве ключа сортировки используется идентификатор типа int. Интересно, поддерживает ли чтение на странице пакетной пружины только ключевое слово сортировки типа int? И не поддерживает строковый ключ сортировки?

Это ограничение по весне?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Это не ограничение весенней партии.Вот как работает база данных.Сортирует строку по значению ascii.

0 голосов
/ 16 апреля 2019

Приведенный выше код в вопросе сработал и решил мою проблему с памятью, причина, по которой он не работал, заключается в том, что я все еще вызываю Cursor Reader при определении шага весенней партии.Таким образом, пейджинговый ридер может решить проблему с памятью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...