Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Führen Sie Batch-Operationen durch
Die DynamoDB Enhanced Client API bietet zwei Batch-Methoden, batchGetItem
()batchWriteItem
(
batchGetItem()
Beispiel für
Mit DynamoDbEnhancedClient.batchGetItem()
Im Beispiel nach den Zeilen 1 und 2 erstellen Sie ReadBatch
Objekte, die Sie später nach Kommentarzeile 3 als Parameter batchGetItem()
zur Methode hinzufügen.
Der Code nach der ersten Kommentarzeile erstellt den Batch, der aus der Customer
Tabelle gelesen werden soll. Der Code nach der Kommentarzeile 1a zeigt die Verwendung eines GetItemEnhancedRequest
Builders, der einen Primärschlüsselwert und einen Sortierschlüsselwert verwendet, um das zu lesende Element anzugeben. Wenn die Datenklasse über einen zusammengesetzten Schlüssel verfügt, müssen Sie sowohl den Partitionsschlüsselwert als auch den Sortierschlüsselwert angeben.
Im Gegensatz zur Angabe von Schlüsselwerten für die Anforderung eines Elements können Sie eine Datenklasse verwenden, um ein Element anzufordern, wie nach Kommentarzeile 1b gezeigt. Das SDK extrahiert die Schlüsselwerte hinter den Kulissen, bevor die Anfrage gesendet wird.
Wenn Sie das Element mithilfe des schlüsselbasierten Ansatzes angeben, wie in den beiden Anweisungen nach 2a gezeigt, können Sie auch angeben, dass DynamoDB einen stark konsistenten Lesevorgang durchführen soll. Wenn die consistentRead()
Methode verwendet wird, muss sie für alle angeforderten Elemente für dieselbe Tabelle verwendet werden.
Verwenden Sie die resultsForTable()
Methode, die nach Kommentarzeile 4 angezeigt wird, um die von DynamoDB gefundenen Elemente abzurufen. Rufen Sie die Methode für jede Tabelle auf, die in der Anforderung gelesen wurde. resultsForTable()
gibt eine Liste der gefundenen Elemente zurück, die Sie mit einer beliebigen java.util.List
Methode verarbeiten können. In diesem Beispiel wird jedes Element protokolliert.
Um Elemente zu finden, die DynamoDB nicht verarbeitet hat, verwenden Sie den Ansatz nach Kommentarzeile 5. Die BatchGetResultPage
Klasse verfügt über die unprocessedKeysForTable()
Methode, mit der Sie auf jeden Schlüssel zugreifen können, der nicht verarbeitet wurde. Die BatchGetItem API-Referenz enthält weitere Informationen zu Situationen, die zu unverarbeiteten Elementen führen.
public static void batchGetItemExample(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<Customer> customerTable, DynamoDbTable<MovieActor> movieActorTable) { Customer customer2 = new Customer(); customer2.setId("2"); customer2.setEmail("cust2@example.org"); // 1. Build a batch to read from the Customer table. ReadBatch customerBatch = ReadBatch.builder(Customer.class) .mappedTableResource(customerTable) // 1a. Specify the primary key value and sort key value for the item. .addGetItem(b -> b.key(k -> k.partitionValue("1").sortValue("cust1@orgname.org"))) // 1b. Alternatively, supply a data class instances to provide the primary key values. .addGetItem(customer2) .build(); // 2. Build a batch to read from the MovieActor table. ReadBatch moveActorBatch = ReadBatch.builder(MovieActor.class) .mappedTableResource(movieActorTable) // 2a. Call consistentRead(Boolean.TRUE) for each item for the same table. .addGetItem(b -> b.key(k -> k.partitionValue("movie01").sortValue("actor1")).consistentRead(Boolean.TRUE)) .addGetItem(b -> b.key(k -> k.partitionValue("movie01").sortValue("actor4")).consistentRead(Boolean.TRUE)) .build(); // 3. Add ReadBatch objects to the request. BatchGetResultPageIterable resultPages = enhancedClient.batchGetItem(b -> b.readBatches(customerBatch, moveActorBatch)); // 4. Retrieve the successfully requested items from each table. resultPages.resultsForTable(customerTable).forEach(item -> logger.info(item.toString())); resultPages.resultsForTable(movieActorTable).forEach(item -> logger.info(item.toString())); // 5. Retrieve the keys of the items requested but not processed by the service. resultPages.forEach((BatchGetResultPage pageResult) -> { pageResult.unprocessedKeysForTable(customerTable).forEach(key -> logger.info("Unprocessed item key: " + key.toString())); pageResult.unprocessedKeysForTable(movieActorTable).forEach(key -> logger.info("Unprocessed item key: " + key.toString())); }); }
Gehen Sie davon aus, dass sich die folgenden Elemente in den beiden Tabellen befinden, bevor Sie den Beispielcode ausführen.
Customer [id=1, name=CustName1, email=cust1@example.org, regDate=2023-03-31T15:46:27.688Z] Customer [id=2, name=CustName2, email=cust2@example.org, regDate=2023-03-31T15:46:28.688Z] Customer [id=3, name=CustName3, email=cust3@example.org, regDate=2023-03-31T15:46:29.688Z] Customer [id=4, name=CustName4, email=cust4@example.org, regDate=2023-03-31T15:46:30.688Z] Customer [id=5, name=CustName5, email=cust5@example.org, regDate=2023-03-31T15:46:31.689Z] MovieActor{movieName='movie01', actorName='actor0', actingAward='actingaward0', actingYear=2001, actingSchoolName='null'} MovieActor{movieName='movie01', actorName='actor1', actingAward='actingaward1', actingYear=2001, actingSchoolName='actingschool1'} MovieActor{movieName='movie01', actorName='actor2', actingAward='actingaward2', actingYear=2001, actingSchoolName='actingschool2'} MovieActor{movieName='movie01', actorName='actor3', actingAward='actingaward3', actingYear=2001, actingSchoolName='null'} MovieActor{movieName='movie01', actorName='actor4', actingAward='actingaward4', actingYear=2001, actingSchoolName='actingschool4'}
Die folgende Ausgabe zeigt die zurückgegebenen und protokollierten Elemente nach Kommentarzeile 4.
Customer [id=1, name=CustName1, email=cust1@example.org, regDate=2023-03-31T15:46:27.688Z] Customer [id=2, name=CustName2, email=cust2@example.org, regDate=2023-03-31T15:46:28.688Z] MovieActor{movieName='movie01', actorName='actor4', actingAward='actingaward4', actingYear=2001, actingSchoolName='actingschool4'} MovieActor{movieName='movie01', actorName='actor1', actingAward='actingaward1', actingYear=2001, actingSchoolName='actingschool1'}
batchWriteItem()
Beispiel für
Die batchWriteItem()
Methode fügt mehrere Elemente in eine oder mehrere Tabellen ein oder löscht sie. Sie können bis zu 25 einzelne Put- oder Löschvorgänge in der Anfrage angeben. Im folgenden Beispiel werden die zuvor gezeigten Klassen ProductCatalogund MovieActorModellklassen verwendet.
WriteBatch
Objekte werden nach den Kommentarzeilen 1 und 2 erstellt. Für die ProductCatalog
Tabelle fügt der Code ein Element ein und löscht ein Element. Für die MovieActor
Tabelle nach Kommentarzeile 2 fügt der Code zwei Elemente ein und löscht eines.
Die batchWriteItem
Methode wird nach Kommentarzeile 3 aufgerufen. Der builder
Parameter stellt die Batch-Anfragen für jede Tabelle bereit.
Das zurückgegebene BatchWriteResult
Objekt bietet separate Methoden für jeden Vorgang, um unverarbeitete Anfragen anzuzeigen. Der Code nach der Kommentarzeile 4a stellt die Schlüssel für unverarbeitete Löschanfragen bereit und der Code nach der Kommentarzeile 4b stellt die unverarbeiteten PUT-Elemente bereit.
public static void batchWriteItemExample(DynamoDbEnhancedClient enhancedClient, DynamoDbTable<ProductCatalog> catalogTable, DynamoDbTable<MovieActor> movieActorTable) { // 1. Build a batch to write to the ProductCatalog table. WriteBatch products = WriteBatch.builder(ProductCatalog.class) .mappedTableResource(catalogTable) .addPutItem(b -> b.item(getProductCatItem1())) .addDeleteItem(b -> b.key(k -> k .partitionValue(getProductCatItem2().id()) .sortValue(getProductCatItem2().title()))) .build(); // 2. Build a batch to write to the MovieActor table. WriteBatch movies = WriteBatch.builder(MovieActor.class) .mappedTableResource(movieActorTable) .addPutItem(getMovieActorYeoh()) .addPutItem(getMovieActorBlanchettPartial()) .addDeleteItem(b -> b.key(k -> k .partitionValue(getMovieActorStreep().getMovieName()) .sortValue(getMovieActorStreep().getActorName()))) .build(); // 3. Add WriteBatch objects to the request. BatchWriteResult batchWriteResult = enhancedClient.batchWriteItem(b -> b.writeBatches(products, movies)); // 4. Retrieve keys for items the service did not process. // 4a. 'unprocessedDeleteItemsForTable()' returns keys for delete requests that did not process. if (batchWriteResult.unprocessedDeleteItemsForTable(movieActorTable).size() > 0) { batchWriteResult.unprocessedDeleteItemsForTable(movieActorTable).forEach(key -> logger.info(key.toString())); } // 4b. 'unprocessedPutItemsForTable()' returns keys for put requests that did not process. if (batchWriteResult.unprocessedPutItemsForTable(catalogTable).size() > 0) { batchWriteResult.unprocessedPutItemsForTable(catalogTable).forEach(key -> logger.info(key.toString())); } }
Die folgenden Hilfsmethoden stellen die Modellobjekte für die Put- und Delete-Operationen bereit.
public static ProductCatalog getProductCatItem1() { return ProductCatalog.builder() .id(2) .isbn("1-565-85698") .authors(new HashSet<>(Arrays.asList("a", "b"))) .price(BigDecimal.valueOf(30.22)) .title("Title 55") .build(); } public static ProductCatalog getProductCatItem2() { return ProductCatalog.builder() .id(4) .price(BigDecimal.valueOf(40.00)) .title("Title 1") .build(); } public static MovieActor getMovieActorBlanchettPartial() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Cate Blanchett"); movieActor.setMovieName("Blue Jasmine"); movieActor.setActingYear(2023); movieActor.setActingAward("Best Actress"); return movieActor; } public static MovieActor getMovieActorStreep() { MovieActor movieActor = new MovieActor(); movieActor.setActorName("Meryl Streep"); movieActor.setMovieName("Sophie's Choice"); movieActor.setActingYear(1982); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("Yale School of Drama"); return movieActor; } public static MovieActor getMovieActorYeoh(){ MovieActor movieActor = new MovieActor(); movieActor.setActorName("Michelle Yeoh"); movieActor.setMovieName("Everything Everywhere All at Once"); movieActor.setActingYear(2023); movieActor.setActingAward("Best Actress"); movieActor.setActingSchoolName("Royal Academy of Dance"); return movieActor; }
Gehen Sie davon aus, dass die Tabellen die folgenden Elemente enthalten, bevor Sie den Beispielcode ausführen.
MovieActor{movieName='Blue Jasmine', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2013, actingSchoolName='National Institute of Dramatic Art'} MovieActor{movieName='Sophie's Choice', actorName='Meryl Streep', actingAward='Best Actress', actingYear=1982, actingSchoolName='Yale School of Drama'} ProductCatalog{id=4, title='Title 1', isbn='orig_isbn', authors=[b, g], price=10}
Nach Abschluss des Beispielcodes enthalten die Tabellen die folgenden Elemente.
MovieActor{movieName='Blue Jasmine', actorName='Cate Blanchett', actingAward='Best Actress', actingYear=2013, actingSchoolName='null'} MovieActor{movieName='Everything Everywhere All at Once', actorName='Michelle Yeoh', actingAward='Best Actress', actingYear=2023, actingSchoolName='Royal Academy of Dance'} ProductCatalog{id=2, title='Title 55', isbn='1-565-85698', authors=[a, b], price=30.22}
Beachten Sie in der MovieActor
Tabelle, dass das Blue Jasmine
Filmelement durch das Element ersetzt wurde, das in der Put-Anfrage verwendet wurde, die mit der getMovieActorBlanchettPartial()
Helper-Methode abgerufen wurde. Wenn kein Data-Bean-Attributwert angegeben wurde, wird der Wert in der Datenbank entfernt. Aus diesem Grund ist das Ergebnis actingSchoolName
für das Blue Jasmine
Filmelement Null.
Anmerkung
In der API-Dokumentation wird zwar darauf hingewiesen, dass Bedingungsausdrücke verwendet werden können und dass verbrauchte Kapazität und Erfassungsmetriken mit einzelnen Put