DynamoDB - Recupero in batch

Le operazioni di recupero batch restituiscono gli attributi di uno o più elementi. Queste operazioni generalmente consistono nell'usare la chiave primaria per identificare gli elementi desiderati. IlBatchGetItem le operazioni sono soggette ai limiti delle singole operazioni nonché ai propri vincoli unici.

Le seguenti richieste nelle operazioni di recupero batch comportano il rifiuto:

  • Fai una richiesta per più di 100 articoli.
  • Effettua una richiesta che supera la velocità effettiva.

Le operazioni di recupero in batch eseguono l'elaborazione parziale delle richieste che possono potenzialmente superare i limiti.

For example- una richiesta di recuperare più elementi di dimensioni sufficientemente grandi da superare i limiti risulta in parte dell'elaborazione della richiesta e un messaggio di errore che segnala la parte non elaborata. Alla restituzione di articoli non elaborati, creare una soluzione di algoritmo di back-off per gestire questo invece di limitare le tabelle.

Il BatchGetle operazioni vengono eseguite eventualmente con letture coerenti, richiedendo modifiche per quelle fortemente coerenti. Eseguono anche recuperi in parallelo.

Note- L'ordine degli articoli restituiti. DynamoDB non ordina gli elementi. Inoltre non indica l'assenza degli articoli richiesti. Inoltre, tali richieste consumano unità di capacità.

Tutte le operazioni BatchGet richiedono RequestItems parametri come la coerenza di lettura, i nomi degli attributi e le chiavi primarie.

Response - Un'operazione riuscita si traduce in una risposta HTTP 200, che indica caratteristiche come unità di capacità consumate, metriche di elaborazione delle tabelle e tutti gli elementi non elaborati.

Recuperi in batch con Java

L'utilizzo di Java nelle operazioni BatchGet richiede la creazione di un'istanza di classe DynamoDB, TableKeysAndAttributes istanza di classe che descrive un elenco di valori di chiave primaria per gli elementi e passa l'oggetto TableKeysAndAttributes all'oggetto BatchGetItem metodo.

Di seguito è riportato un esempio di un'operazione 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); 
   } 
}

Puoi rivedere il seguente esempio più ampio.

Note- Il seguente programma può assumere un'origine dati creata in precedenza. Prima di tentare l'esecuzione, acquisire le librerie di supporto e creare le origini dati necessarie (tabelle con caratteristiche richieste o altre fonti di riferimento).

Questo programma utilizza anche Eclipse IDE, un file delle credenziali AWS e AWS Toolkit all'interno di un progetto 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()); 
      }   
   } 
}