批量检索操作返回单个或多个项目的属性.这些操作通常包括使用主键来识别所需的项目. 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- 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); Mapunprocessed = null; do { for (String tableName : outcome.getTableItems().keySet()) { System.out.println("Table items for " + tableName); List - 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()); } } }