包含和不包含分页的DynamoDB Table.scan

时间:2016-09-13 14:56:25

标签: java pagination amazon-dynamodb aws-sdk

我试图了解以下两个代码段之间的区别。一个使用页面来获取扫描结果,而第二个不使用。我想知道如果数据库中的项目总数非常大,第二种方法是否有效? AWS文档称扫描结果受限于1 Mb。这对第2版有何影响?它只会获得前1 MB的结果,还是会在每个页面后进行数据库调用?

请注意,我使用的是table.scan API,它与DynamoDBClient.scan api不同。有关API的详细信息,请参阅http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html

版本1(使用页面):

            ItemCollection<ScanOutcome> items = table.scan(spec);
            items.pages().forEach(page -> {
                for (Item item : page) {
                    response.add(item);
                }
            });

版本2(迭代没有页面的项目):

            ItemCollection<ScanOutcome> items = table.scan(spec);
            for (Item item : items) {
                    response.add(item);
            }

2 个答案:

答案 0 :(得分:2)

Tofig是对的。这两种方法没有区别。关于扫描结果限制为1 MB的声明仅适用于不适用于Document API的低级API 来自ItemCollection

的文档
  

项目的集合。 ItemCollection对象维护游标   指向其当前的数据页面。最初光标是   位于第一页之前。下一个方法将光标移动到   下一行,因为当没有更多行时它返回false   在ItemCollection对象中,它可以在while循环中使用   遍历集合。 可以触发网络通话   该集合跨页边界重复

答案 1 :(得分:0)

我进行了一项实验,我创建了1000条记录,每条记录的大小为5kb。然后我使用版本2来扫描表格并且仍然获得所有1000条记录,尽管总大小明显> 1MB。两个版本扫描整个表格,所以似乎没有区别。似乎ItemCollection为您处理分页,除非您想控制网络调用和页面大小,否则不需要使用页面。