DynamoDB-일괄 검색

일괄 검색 작업은 단일 또는 여러 항목의 속성을 반환합니다. 이러한 작업은 일반적으로 원하는 항목을 식별하기 위해 기본 키를 사용하는 것으로 구성됩니다. 그만큼BatchGetItem 작업에는 개별 작업의 한계와 고유 한 제약이 적용됩니다.

일괄 검색 작업에서 다음 요청은 거부 결과-

  • 100 개 이상의 항목을 요청하십시오.
  • 처리량을 초과하는 요청을합니다.

일괄 검색 작업은 제한을 초과 할 가능성이있는 요청을 부분적으로 처리합니다.

For example− 제한을 초과 할만큼 크기가 충분히 큰 여러 항목을 검색하라는 요청은 요청 처리의 일부가되고 처리되지 않은 부분을 알려주는 오류 메시지가 발생합니다. 처리되지 않은 항목이 반환되면 테이블을 제한하는 대신이를 관리하는 백 오프 알고리즘 솔루션을 만듭니다.

그만큼 BatchGet작업은 결국 일관된 읽기로 수행되므로 강력한 일관된 읽기를 수정해야합니다. 또한 검색을 병렬로 수행합니다.

Note− 반품 된 품목의 주문. DynamoDB는 항목을 정렬하지 않습니다. 또한 요청 된 항목이 없음을 나타내지 않습니다. 또한 이러한 요청은 용량 단위를 사용합니다.

모든 BatchGet 작업에 필요한 RequestItems 읽기 일관성, 속성 이름 및 기본 키와 같은 매개 변수.

Response − 작업이 성공하면 사용 된 용량 단위, 테이블 처리 메트릭 및 처리되지 않은 항목과 같은 특성을 나타내는 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); 
   } 
}

다음과 같은 더 큰 예를 검토 할 수 있습니다.

Note− 다음 프로그램은 이전에 생성 된 데이터 소스를 가정 할 수 있습니다. 실행을 시도하기 전에 지원 라이브러리를 확보하고 필요한 데이터 소스 (필수 특성이있는 테이블 또는 기타 참조 소스)를 작성하십시오.

이 프로그램은 또한 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()); 
      }   
   } 
}