DynamoDB - Toplu Alma

Toplu Geri Alma işlemleri, bir veya birden çok öğenin özelliklerini döndürür. Bu işlemler genellikle istenen öğeleri tanımlamak için birincil anahtarın kullanılmasından oluşur. BatchGetItem işlemler, bireysel işlemlerin sınırlarının yanı sıra kendi benzersiz sınırlamalarına tabidir.

Toplu alım işlemlerinde aşağıdaki istekler ret ile sonuçlanır -

  • 100'den fazla ürün için talepte bulunun.
  • Verimi aşan bir istekte bulunun.

Toplu geri alma işlemleri, sınırları aşma potansiyeli taşıyan taleplerin kısmi işlemesini gerçekleştirir.

For example- Sınırları aşmaya yetecek büyüklükte birden fazla öğenin alınması talebi, talep işlemenin bir kısmıyla sonuçlanır ve işlenmemiş kısmı belirten bir hata mesajı. İşlenmemiş öğelerin iadesi üzerine, bunu yönetmek için kısıtlama tabloları yerine bir geri çekme algoritması çözümü oluşturun.

BatchGetişlemler sonunda tutarlı okumalarla gerçekleştirilir ve son derece tutarlı olanlar için değişiklik gerektirir. Ayrıca geri alma işlemlerini paralel olarak gerçekleştirirler.

Note- İade edilen ürünlerin sırası. DynamoDB, öğeleri sıralamaz. Ayrıca istenen öğelerin yokluğunu da göstermez. Ayrıca, bu istekler kapasite birimlerini tüketir.

Tüm BatchGet işlemleri için RequestItems okuma tutarlılığı, öznitelik adları ve birincil anahtarlar gibi parametreler.

Response - Başarılı bir işlem, tüketilen kapasite birimleri, tablo işleme ölçümleri ve işlenmemiş öğeler gibi özellikleri gösteren bir HTTP 200 yanıtıyla sonuçlanır.

Java ile Toplu Alımlar

BatchGet işlemlerinde Java kullanmak bir DynamoDB sınıfı örneği oluşturmayı gerektirir, TableKeysAndAttributes öğeler için birincil anahtar değerleri listesini açıklayan ve TableKeysAndAttributes nesnesini the BatchGetItem yöntem.

Aşağıda bir BatchGet işlemi örneği verilmiştir -

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); 
   } 
}

Aşağıdaki daha büyük örneği inceleyebilirsiniz.

Note- Aşağıdaki program önceden oluşturulmuş bir veri kaynağını varsayabilir. Yürütme girişiminde bulunmadan önce, destekleyici kitaplıklar edinin ve gerekli veri kaynaklarını oluşturun (gerekli özelliklere sahip tablolar veya diğer başvurulan kaynaklar).

Bu program ayrıca bir Eclipse AWS Java Projesi içinde bir AWS kimlik bilgileri dosyası olan Eclipse IDE ve AWS Toolkit'i kullanır.

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