![](/img/trans.png)
[英]Spring Batch JDBCPagingItemReader is not invoked from slaveStep
[英]Spring Batch JdbcPagingItemReader paging not work
我使用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;
}
我指定的sortkey是表中的主鍵,它是一個字符串。 但是分頁無法正常工作。 但是它只讀取所有數據就不會引發任何錯誤。
在Spring Batch文檔中,它提供了一個使用int類型id作為排序關鍵字的示例,我想知道Spring Batch分頁只讀是否支持int類型排序關鍵字? 並且不能支持字符串排序鍵?
這是春季批處理的限制嗎?
它不是春季批處理的限制。 這就是數據庫的工作方式。 它根據其ascii值對字符串進行排序。
問題中的上面的代碼確實可以解決我的內存問題,但之所以不起作用,是因為我在春季批處理定義中仍然調用Cursor Reader。 這樣分頁閱讀器可以解決內存問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.