DynamoDB - recuperação em lote
As operações de recuperação em lote retornam atributos de um ou vários itens. Essas operações geralmente consistem em usar a chave primária para identificar o (s) item (ns) desejado (s). oBatchGetItem as operações estão sujeitas aos limites das operações individuais, bem como às suas próprias restrições exclusivas.
As seguintes solicitações em operações de recuperação em lote resultam em rejeição -
- Faça uma solicitação de mais de 100 itens.
- Faça uma solicitação que exceda a taxa de transferência.
As operações de recuperação em lote executam o processamento parcial de solicitações com potencial de exceder os limites.
For example- uma solicitação para recuperar vários itens grandes o suficiente em tamanho para exceder os limites resulta em parte do processamento da solicitação e uma mensagem de erro observando a parte não processada. Na devolução de itens não processados, crie uma solução de algoritmo de retirada para gerenciar isso, em vez de tabelas de limitação.
o BatchGetoperações são executadas eventualmente com leituras consistentes, exigindo modificação para leituras fortemente consistentes. Eles também realizam recuperações em paralelo.
Note- A ordem dos itens devolvidos. O DynamoDB não classifica os itens. Também não indica a ausência dos itens solicitados. Além disso, essas solicitações consomem unidades de capacidade.
Todas as operações BatchGet exigem RequestItems parâmetros como consistência de leitura, nomes de atributos e chaves primárias.
Response - Uma operação bem-sucedida resulta em uma resposta HTTP 200, que indica características como unidades de capacidade consumidas, métricas de processamento de tabela e quaisquer itens não processados.
Recuperações em lote com Java
Usar Java em operações BatchGet requer a criação de uma instância de classe DynamoDB, TableKeysAndAttributes instância de classe que descreve uma lista de valores de chave primária para os itens e passa o objeto TableKeysAndAttributes para o BatchGetItem método.
A seguir está um exemplo de uma operação 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);
}
}
Você pode revisar o seguinte exemplo maior.
Note- O programa a seguir pode assumir uma fonte de dados criada anteriormente. Antes de tentar executar, adquira bibliotecas de suporte e crie as fontes de dados necessárias (tabelas com as características necessárias ou outras fontes referenciadas).
Este programa também usa Eclipse IDE, um arquivo de credenciais AWS e o AWS Toolkit em um projeto Eclipse AWS Java.
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());
}
}
}