DynamoDB - 批量检索
批量检索操作返回单个或多个项目的属性。 这些操作通常包括使用主键来标识所需的项目。 BatchGetItem 操作受到各个操作及其自身独特约束的限制。
批量检索操作中以下请求会导致拒绝 −
- 请求超过 100 件商品。
- 发出超出吞吐量的请求。
批量检索操作对可能超出限制的请求执行部分处理。
例如 − 检索大小足够大以超出限制的多个项目的请求会导致请求处理的一部分,并显示一条错误消息,指出未处理的部分。 返回未处理的项目时,创建一个退避算法解决方案来管理此问题,而不是限制表。
BatchGet 操作最终以一致的读取执行,需要修改为强一致的读取。 它们还并行执行检索。
注意 − 退回物品的顺序。 DynamoDB 不会对项目进行排序。 它也不表示不存在所请求的项目。 此外,这些请求会消耗容量单位。
所有BatchGet操作都需要RequestItems参数,例如读取一致性、属性名称和主键。
响应 − 成功的操作会产生 HTTP 200 响应,该响应指示消耗的容量单位、表处理指标以及任何未处理的项目等特征。
使用 Java 批量检索
在 BatchGet 操作中使用 Java 需要创建 DynamoDB 类实例、描述项目主键值列表的 TableKeysAndAttributes 类实例,并将 TableKeysAndAttributes 对象传递给 BatchGetItem 方法。
以下是 BatchGet 操作的示例 −
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient ( new ProfileCredentialsProvider())); TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes (forumTableName); forumTableKeysAndAttributes.addHashOnlyPrimaryKeys ( "Title", "Updates", "Product Line 1" ); TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes ( threadTableName); threadTableKeysAndAttributes.addHashAndRangePrimaryKeys ( "ForumTitle", "Topic", "Product Line 1", "P1 Thread 1", "Product Line 1", "P1 Thread 2", "Product Line 2", "P2 Thread 1" ); BatchGetItemOutcome outcome = dynamoDB.batchGetItem ( forumTableKeysAndAttributes, threadTableKeysAndAttributes); for (String tableName : outcome.getTableItems().keySet()) { System.out.println("Table items " + tableName); List<Item> items = outcome.getTableItems().get(tableName); for (Item item : items) { System.out.println(item); } }
您可以查看以下更大的示例。
注意 − 以下程序可能假定先前创建的数据源。 在尝试执行之前,获取支持库并创建必要的数据源(具有所需特征的表或其他引用源)。
此程序还使用 Eclipse IDE、AWS 凭证文件以及 Eclipse AWS Java 项目中的 AWS Toolkit。
package com.amazonaws.codesamples.document; import java.io.IOException; import java.util.List; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.document.BatchGetItemOutcome; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes; import com.amazonaws.services.dynamodbv2.model.KeysAndAttributes; public class BatchGetOpSample { static DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient ( new ProfileCredentialsProvider())); static String forumTableName = "Forum"; static String threadTableName = "Thread"; public static void main(String[] args) throws IOException { retrieveMultipleItemsBatchGet(); } private static void retrieveMultipleItemsBatchGet() { try { TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes(forumTableName); //Create partition key forumTableKeysAndAttributes.addHashOnlyPrimaryKeys ( "Name", "XYZ Melt-O-tron", "High-Performance Processing" ); TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes(threadTableName); //Create partition key and sort key threadTableKeysAndAttributes.addHashAndRangePrimaryKeys ( "ForumName", "Subject", "High-Performance Processing", "HP Processing Thread One", "High-Performance Processing", "HP Processing Thread Two", "Melt-O-Tron", "MeltO Thread One" ); System.out.println("Processing..."); BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes, threadTableKeysAndAttributes); Map<String, KeysAndAttributes> unprocessed = null; do { for (String tableName : outcome.getTableItems().keySet()) { System.out.println("Table items for " + tableName); List<Item> items = outcome.getTableItems().get(tableName); for (Item item : items) { System.out.println(item.toJSONPretty()); } } // Confirm no unprocessed items unprocessed = outcome.getUnprocessedKeys(); if (unprocessed.isEmpty()) { System.out.println("All items processed."); } else { System.out.println("Gathering unprocessed items..."); outcome = dynamoDB.batchGetItemUnprocessed(unprocessed); } } while (!unprocessed.isEmpty()); } catch (Exception e) { System.err.println("Could not get items."); System.err.println(e.getMessage()); } } }