我想在DynamoDB similar to Postgres中实现基于数字限制和偏移量的分页。
我的API看起来像这样:http://foo.bar/user?offset=50&limit=20
。
在Java中做到这一点而又不冒OutOfMemoryError
考虑DynamoDB uses ExclusiveStartKey
and LastEvaluatedKey
to paginate的风险的最佳方法是什么?
编辑:
让我们假设基于偏移量的分页是一项艰巨的要求,我不知道“先前”页面。我的API合同具有如上所述的offset
和limit
查询参数。我不是在寻找“不要做基于偏移的分页”的答案。
答案 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);
当然,我会在这里实现自己的skip
和collect
方法的成本。有没有更好/更简洁的方法可以做到这一点?
编辑:
似乎我可以利用IteratorUtils from commons-collections免费获得skip
和collect
:
Iterator<MyUser> userIterator = IteratorUtils.boundedIterator(users.iterator(), offset, limit);
List<MyUser> aPageOfUser = IteratorUtils.toList(userIterator);