当前位置: 首页 > 知识库问答 >
问题:

使用DynamoDBMapper Java AWS SDK进行分页

方英耀
2023-03-14

从API文档来看,dynamo db确实支持扫描和查询操作的分页。这里的关键是将当前请求的ExclusiveStartIndex设置为上一个请求的LastEvaluatedIndex的值,以获得下一组(逻辑页面)结果。

我试图实现同样的功能,但我使用的是DynamoDBMapper,它似乎有很多优点,比如与数据模型紧密耦合。因此,如果我想做上述工作,我假设我会做如下工作:

// Mapping of hashkey of the last item in previous query operation
Map<String, AttributeValue> lastHashKey = .. 
DynamoDBQueryExpression expression = new DynamoDBQueryExpression();

...
expression.setExclusiveStartKey();
List<Table> nextPageResults = mapper.query(Table.class, expression);

我希望我的上述理解是正确的分页使用DynamoDBMapper。其次,我怎么知道我已经达到了结果的终点。如果我使用以下api,请参阅文档:

QueryResult result = dynamoDBClient.query((QueryRequest) request);
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey());

回到使用DynamoDBMapper,我如何知道在这种情况下我是否达到了最终结果。

共有1个答案

太叔京
2023-03-14

使用DynamoDBMapper,您有两个不同的选项,具体取决于您想走哪条路。

  • query-返回一个PaginatedQueryList
  • queryPage-返回QueryResultPage
  • scan-返回一个PaginatedScanList
  • scanPage-返回scanpresultpage

这里的部分是理解方法之间的区别,以及它们返回的对象封装了什么功能。

我将介绍PaginatedScanListScanResultPage,但是这些方法/对象基本上是相互镜像的。

PaginatedScanList显示了以下内容,我的重点是:

在AWS DynamoDB中实现表示扫描结果的列表接口。分页结果在用户执行需要它们的操作时按需加载。某些操作(如size())必须获取整个列表,但在可能的情况下会逐页延迟获取结果。

这表示在遍历列表时加载结果。当您完成第一个页面时,第二个页面将自动获取,而无需显式地发出另一个请求。延迟加载结果是默认方法,但如果调用重载方法并使用不同的DynamoDBMapperConfig.PaginationLoadingStrategy提供DynamoDBMapperConfig,则可以重写该方法。

这与扫描结果页不同。您将获得一页结果,这取决于您自己处理分页。

下面是一个快速代码示例,显示了两种方法的示例用法,我使用DynamoDBLocal运行了一个包含5项的表:

final DynamoDBMapper mapper = new DynamoDBMapper(client);

// Using 'PaginatedScanList'
final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression()
        .withLimit(limit);
final PaginatedScanList<MyClass> paginatedList = mapper.scan(MyClass.class, paginatedScanListExpression);
paginatedList.forEach(System.out::println);

System.out.println();
// using 'ScanResultPage'
final DynamoDBScanExpression scanPageExpression = new DynamoDBScanExpression()
        .withLimit(limit);
do {
    ScanResultPage<MyClass> scanPage = mapper.scanPage(MyClass.class, scanPageExpression);
    scanPage.getResults().forEach(System.out::println);
    System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey());
    scanPageExpression.setExclusiveStartKey(scanPage.getLastEvaluatedKey());

} while (scanPageExpression.getExclusiveStartKey() != null);

以及输出:

MyClass{hash=2}
MyClass{hash=1}
MyClass{hash=3}
MyClass{hash=0}
MyClass{hash=4}

MyClass{hash=2}
MyClass{hash=1}
LastEvaluatedKey={hash={N: 1,}}
MyClass{hash=3}
MyClass{hash=0}
LastEvaluatedKey={hash={N: 0,}}
MyClass{hash=4}
LastEvaluatedKey=null
 类似资料:
  • 问题内容: NumPy / SciPy或相关库中是否有类似Matlab的函数? 以供参考。Procrustes分析的目的是对齐2组点(换句话说,是2个形状),以通过消除缩放,平移和旋转扭曲分量来最小化它们之间的平方距离。 Matlab中的示例: NumPy中的相同任务: 注意:我只对对齐的形状感兴趣,因为平方误差(在Matlab代码中可变)很容易从2个形状中计算出来。 问题答案: 我不知道Pyth

  • 在我正在开发的应用程序中,我需要知道一串单词是否是名词短语、动词短语等。我知道NP和VP既不是依赖项,也不是位置。我也知道要做到这一点,我可能需要某种分块工具,但我找不到任何开源工具。 在SyntaxNet输出的“她真的很喜欢可爱的黑狗”一句中: 我注意到NP“可爱的黑狗”已经放在了自己的树节点中: 所以我想知道是否有任何方法可以将SyntaxNet用作chunker?

  • 问题内容: 我想使用itext生成pdf。我会在某些时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上插入。有任何想法吗??? 问题答案: 调用告诉iText将后续对象放置在新页面上。仅当您放置下一个对象时,才会真正创建新页面。另外,仅在当前页面不为空白时创建一个新页面;否则,仅创建一个新页面。否则,它将被忽略;您可以用来克服这一点。 请参见下面的链

  • 问题内容: 细节 来自应用程序的HQL查询: 查询返回300万条记录,而对于分页,我们仅设置了其中的50条记录,分页页面的运行速度非常慢,因为每次刷新时,我们都调用查询来获取300万条记录,而其中只有50条记录。 我的主要问题是 HQL是始终运行并命中数据库还是运行命中会话或内存以查找数据,如果它每次都运行时命中数据库并获取结果集,那么从性能的角度来看,这是非常合适的,什么是改进的最佳解决方案它?

  • 问题内容: 问题 我需要在Django模板中使用jQuery进行Ajax分页。 情况 我的模板中包含以下代码: 和我的看法: 结论 因此,每当我按“下一步”时,它实际上会发出Ajax请求,但数据不会在表中呈现。 对于分页,使用django.core.paginator,我真的很愿意在可能的情况下坚持使用。 您能看到代码缺失/错误吗? 问题答案: 我没有发现错误,但下面向您展示如何解决此任务。我认为

  • 我想用iText生成一个pdf。我会在某个时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上这样做。有什么想法吗???

  • 我正在使用我有一个类,如下所示: 现在我想做的是: 筛选出senderId无效的记录(使用映射) 下面是我的代码: 这给我带来了一个错误: 错误:(105,90)java:找不到适用于groupingBy(共享[…]的方法gMode,java。util。作用函数)方法java。util。流动收藏家。groupingBy(java.util.function.function)不适用(无法推断类型变

  • 问题内容: 已关闭 。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我正在寻找一个使用jQuery,PHP和MySQL的很好的Ajax分页教程。我遇到的那些不好。 因此,如果有人可以推荐一个好的网站/教程,那就太好了。谢谢。 编辑 这是一些不好的教程。 网站1 网站2 网站3 问题答案: 这是 CakePHP的 一个教程