DynamoDB - Récupération par lots

Les opérations de récupération par lots renvoient les attributs d'un ou de plusieurs éléments. Ces opérations consistent généralement à utiliser la clé primaire pour identifier le ou les éléments souhaités. leBatchGetItem les opérations sont soumises aux limites des opérations individuelles ainsi qu'à leurs propres contraintes uniques.

Les requêtes suivantes dans les opérations de récupération par lots entraînent un rejet -

  • Faites une demande pour plus de 100 articles.
  • Faites une demande dépassant le débit.

Les opérations de récupération par lots effectuent un traitement partiel des demandes susceptibles de dépasser les limites.

For example- une demande de récupération de plusieurs éléments de taille suffisante pour dépasser les limites entraîne une partie du traitement de la demande et un message d'erreur indiquant la partie non traitée. Au retour des éléments non traités, créez une solution d'algorithme de back-off pour gérer cela plutôt que de limiter les tables.

le BatchGetles opérations s'effectuent finalement avec des lectures cohérentes, nécessitant des modifications pour celles qui sont fortement cohérentes. Ils effectuent également des récupérations en parallèle.

Note- L'ordre des articles retournés. DynamoDB ne trie pas les éléments. Il n'indique pas non plus l'absence des articles demandés. De plus, ces demandes consomment des unités de capacité.

Toutes les opérations BatchGet nécessitent RequestItems paramètres tels que la cohérence de lecture, les noms d'attributs et les clés primaires.

Response - Une opération réussie entraîne une réponse HTTP 200, qui indique des caractéristiques telles que les unités de capacité consommées, les métriques de traitement de table et tout élément non traité.

Récupérations par lots avec Java

L'utilisation de Java dans les opérations BatchGet nécessite la création d'une instance de classe DynamoDB, TableKeysAndAttributes instance de classe décrivant une liste de valeurs de clé primaire pour les éléments et passant l'objet TableKeysAndAttributes au BatchGetItem méthode.

Voici un exemple d'opération 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); 
   } 
}

Vous pouvez consulter l'exemple plus large suivant.

Note- Le programme suivant peut supposer une source de données précédemment créée. Avant de tenter de l'exécuter, achetez les bibliothèques de prise en charge et créez les sources de données nécessaires (tables avec les caractéristiques requises ou autres sources référencées).

Ce programme utilise également Eclipse IDE, un fichier d'informations d'identification AWS et AWS Toolkit dans un projet 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()); 
      }   
   } 
}