Dynamodb-batch-retrieve
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());
}
}
}