DynamoDB(Java)中基于数字限制和偏移量的分页

时间:2019-09-20 11:25:53

标签: java amazon-dynamodb dynamodb-queries aws-java-sdk-dynamodb

我想在DynamoDB similar to Postgres中实现基于数字限制和偏移量的分页。

我的API看起来像这样:http://foo.bar/user?offset=50&limit=20

在Java中做到这一点而又不冒OutOfMemoryError考虑DynamoDB uses ExclusiveStartKey and LastEvaluatedKey to paginate的风险的最佳方法是什么?

编辑:

让我们假设基于偏移量的分页是一项艰巨的要求,我不知道“先前”页面。我的API合同具有如上所述的offsetlimit查询参数。我不是在寻找“不要做基于偏移的分页”的答案。

1 个答案:

答案 0 :(得分:0)

查看how PaginatedList work in the sdk之后,看来最有效的方法是在配置中使用ITERATION_ONLY分页加载策略,然后执行以下操作:

DynamoDBMapperConfig config = new DynamoDBMapperConfig.Builder()
                       .withPaginationLoadingStrategy(ITERATION_ONLY)
                       .build();
PaginatedQueryList<MyUser> users = dynamoDBMapper.query(MyUser.class, myQueryExpression, config);
// This iterator will fetch 1MB worth of data 'on-demand'
Iterator<MyUser> userIterator = users.iterator();
skip(iterator, offset);
List<MyUser> aPageOfUser = collect(iterator, limit);

当然,我会在这里实现自己的skipcollect方法的成本。有没有更好/更简洁的方法可以做到这一点?

编辑:

似乎我可以利用IteratorUtils from commons-collections免费获得skipcollect

Iterator<MyUser> userIterator = IteratorUtils.boundedIterator(users.iterator(), offset, limit);
List<MyUser> aPageOfUser = IteratorUtils.toList(userIterator);