java - DynamoDB(Java)中基于数字限制和偏移的分页
问题描述
我想在 DynamoDB 中实现类似于 Postgres的数字限制和基于偏移的分页。
我的 API 看起来像这样:http://foo.bar/user?offset=50&limit=20
.
OutOfMemoryError
在不考虑 DynamoDB使用ExclusiveStartKey
和LastEvaluatedKey
分页风险的情况下,在 Java 中执行此操作的最佳方法是什么?
编辑:
让我们假设基于偏移的分页是一个硬性要求,我不知道“先前”页面。我的 API 合同具有offset
和limit
查询参数,如上所述。我不是在寻找“不要做基于偏移的分页”的答案。
解决方案
在查看了 PaginatedList 在 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
。有没有更好/更简洁的方法来做到这一点?
编辑:
看来我可以利用Commons-collections 中的 IteratorUtils来免费获得skip
and collect
:
Iterator<MyUser> userIterator = IteratorUtils.boundedIterator(users.iterator(), offset, limit);
List<MyUser> aPageOfUser = IteratorUtils.toList(userIterator);
推荐阅读
- python - 我想更新我创建的模型。但是,我想通过模型的 id 来做到这一点
- java - 卡在弹簧数据 jpa 左连接上,提供具有相同数据的多条记录
- javascript - 如何从一年中获取日期以及总共过去了多少天?
- c++ - 设计决策:在浮点表示法类的辅助函数中确定适当的算法
- java - javaFX中使用PrinterJob时如何显示完整表格?
- python-3.x - 我有 2 个 Haarcascades 可以工作,但我下载的其他每个 Haarcascades 都没有
- clickhouse - 无法在 clickhouse 设置中添加设置“log_queries=1”
- python - 如何从同一文件夹导入python模块?
- excel - 特定单元格更改时自动刷新 Excel Power Query(我正在使用 VBA)
- spring - 使用 SpringJUnit4ClassRunner 将 Spring 4 迁移到 Spring 5 导致 Junit 失败