D-Klasse ynamoDBMapper - Amazon-DynamoDB

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.

D-Klasse ynamoDBMapper

Die Klasse ADynamoDBMapper ist der Eintrittspunkt für Amazon DynamoDB. Sie stellt Zugriff auf einen DynamoDB-Endpunkt bereit und ermöglicht Ihnen, auf Ihre Daten in verschiedenen Tabellen zuzugreifen. Außerdem können Sie damit verschiedene Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) für Elemente ausführen sowie Abfragen und Scans für Tabellen ausführen. Diese Klasse bietet die folgenden Methoden für die Arbeit mit DynamoDB.

Die entsprechende Javadoc-Dokumentation finden Sie unter D ynamoDBMapper in der AWS SDK for Java API Referenz.

save

Speichert das angegebene Objekt in der Tabelle. Das Objekt, das Sie speichern möchten, ist der einzige erforderliche Parameter für diese Methode. Sie können optionale Konfigurationsparameter mithilfe des DynamoDBMapperConfig-Objekts bereitstellen.

Wenn ein Element mit demselben Primärschlüssel nicht vorhanden ist, erstellt diese Methode ein neues Element in der Tabelle. Wenn ein Element mit demselben Primärschlüssel vorhanden ist, aktualisiert sie das vorhandene Element. Wenn der Partitionsschlüssel und der Sortierschlüssel vom Typ String sind und mit einer Anmerkung versehen sind, erhalten sie einen zufälligen@DynamoDBAutoGeneratedKey, universell eindeutigen Bezeichner (UUID), wenn sie nicht initialisiert werden. Versionsfelder, die mit @DynamoDBVersionAttribute angemerkt sind, werden um eins erhöht. Wenn ein Versionsfeld aktualisiert oder ein Schlüssel generiert wird, wird das übergebene Objekt als Folge der Operation aktualisiert.

Standardmäßig werden nur Attribute aktualisiert, die Eigenschaften der zugewiesenen Klasse entsprechen. Zusätzlich für ein Element vorhandene Attribute sind nicht betroffen. Wenn Sie jedoch SaveBehavior.CLOBBER angeben, können Sie die vollständige Überschreibung des Elements erzwingen.

DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build(); mapper.save(item, config);

Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option SaveBehavior.CLOBBER verwendet wird. Weitere Informationen über das Versioning finden Sie unter DynamoDB und optimistisches Sperren mit Versionsnummer.

load

Ruft ein Element aus einer Tabelle ab. Sie müssen den Primärschlüssel des Elements bereitstellen, das Sie abrufen möchten. Sie können optionale Konfigurationsparameter mithilfe des DynamoDBMapperConfig-Objekts bereitstellen. Beispielsweise können Sie optional Strongly Consistent-Lesevorgänge anfordern, um sicherzustellen, dass diese Methode ausschließlich die neuesten Elementwerte, wie in der folgenden Java-Anweisung dargestellt, bereitstellt.

DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build(); CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);

Standardmäßig gibt DynamoDB das Element zurück, das über Eventually-Consistent-Werte verfügt. Weitere Informationen über das Eventual-Consistency-Modell von DynamoDB finden Sie unter DynamoDB-Lesekonsistenz.

delete

Löscht ein Element aus der Tabelle. Sie müssen eine Objekt-Instance aus der zugeordneten Klasse übergeben.

Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option SaveBehavior.CLOBBER verwendet wird. Weitere Informationen zum Versioning finden Sie unter DynamoDB und optimistisches Sperren mit Versionsnummer.

query

Fragt eine Tabelle oder einen sekundären Index ab.

Angenommen, Sie verfügen über die Tabelle Reply, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle Reply besteht aus den Feldern Id und ReplyDateTime, wobei Id der Partitionsschlüssel und ReplyDateTime der Sortierschlüssel des Primärschlüssels ist.

Reply ( Id, ReplyDateTime, ... )

Angenommen, Sie haben eine Mapping zwischen der Klasse Reply und der entsprechenden Tabelle Reply in DynamoDB erstellt. Der folgende Java-Code verwendet DynamoDBMapper, um alle Antworten der letzten zwei Wochen zu einem bestimmten Thread-Thema zu finden.

Beispiel
String forumName = "&DDB;"; String forumSubject = "&DDB; Thread 1"; String partitionKey = forumName + "#" + forumSubject; long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS(partitionKey)); eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString())); DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>() .withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2") .withExpressionAttributeValues(eav); List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

Die Abfrage gibt eine Sammlung von Reply-Objekten zurück.

Die query-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung latestReplies durchlaufen.

Beachten Sie, dass beim Aufrufen der size()-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass ein großer Teil des bereitgestellten Durchsatzes verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer Tabelle erschöpft sein. JVM

Für eine Indexabfrage müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. Angenommen, die Reply Tabelle hat einen globalen sekundären Index namens PostedBy-Message-Index. Der Partitionsschlüssel für diesen Index ist PostedBy und der Sortierschlüssel ist Message. Die Klassendefinition für ein Element im Index würde wie folgt aussehen.

@DynamoDBTable(tableName="Reply") public class PostedByMessage { private String postedBy; private String message; @DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "PostedBy") public String getPostedBy() { return postedBy; } public void setPostedBy(String postedBy) { this.postedBy = postedBy; } @DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "Message") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } // Additional properties go here. }

Die Anmerkung @DynamoDBTable gibt an, dass dieser Index mit der Tabelle Reply verknüpft ist. Die @DynamoDBIndexHashKey Anmerkung bezeichnet den Partitionsschlüssel (PostedBy) des Indexes und @DynamoDBIndexRangeKey den Sortierschlüssel (Message) des Indexes.

Sie können jetzt DynamoDBMapper nutzen, um den Index abzufragen, der eine Teilmenge der Nachrichten, die von einem bestimmten Benutzer gepostet wurden, abruft. Sie müssen den Indexnamen nicht angeben, wenn Sie keine widersprüchlichen Zuordnungen zwischen Tabellen und Indizes haben und die Zuordnungen bereits im Mapper vorgenommen wurden. Der Mapper leitet anhand des Primärschlüssels und des Sortierschlüssels ab. Der folgende Code fragt den globalen sekundären Index ab. Da globale sekundäre Indizes Eventually Consistent-Lesevorgänge, jedoch keine Strongly Consistent-Lesevorgänge unterstützen, müssen Sie withConsistentRead(false) angeben.

HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("User A")); eav.put(":v2", new AttributeValue().withS("DynamoDB")); DynamoDBQueryExpression<PostedByMessage> queryExpression = new DynamoDBQueryExpression<PostedByMessage>() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false) .withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)") .withExpressionAttributeValues(eav); List<PostedByMessage> iList = mapper.query(PostedByMessage.class, queryExpression);

Die Abfrage gibt eine Sammlung von PostedByMessage-Objekten zurück.

queryPage

Fragt eine Tabelle oder einen sekundären Index ab und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der query-Methode, müssen Sie einen Partitions-Schlüsselwert und einen Abfragefilter angeben, der auf das Sortierschlüsselattribut angewendet wird. queryPage gibt jedoch ausschließlich die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt.

scan

Scannt eine gesamte Tabelle oder einen sekundären Index. Sie können optional einen FilterExpression angeben, um den Ergebnissatz zu filtern.

Angenommen, Sie verfügen über die Tabelle Reply, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle Reply besteht aus den Feldern Id und ReplyDateTime, wobei Id der Partitionsschlüssel und ReplyDateTime der Sortierschlüssel des Primärschlüssels ist.

Reply ( Id, ReplyDateTime, ... )

Wenn Sie der Tabelle Reply eine Java-Klasse zugewiesen haben, können Sie DynamoDBMapper verwenden, um die Tabelle zu scannen. Der folgende Java-Code scannt beispielsweise die gesamte Tabelle Reply und gibt nur die Antworten für ein bestimmtes Jahr zurück.

Beispiel
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("2015")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("begins_with(ReplyDateTime,:v1)") .withExpressionAttributeValues(eav); List<Reply> replies = mapper.scan(Reply.class, scanExpression);

Die scan-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung replies durchlaufen.

Beachten Sie, dass beim Aufrufen der size()-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass ein großer Teil des bereitgestellten Durchsatzes verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer Tabelle erschöpft sein. JVM

Um einen Index zu scannen, müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. Angenommen, die Reply-Tabelle hat einen globalen sekundären Index namens PostedBy-Message-Index. Der Partitionsschlüssel für diesen Index ist PostedBy und der Sortierschlüssel ist Message. Im Abschnitt query wird eine Mapper-Klasse für diesen Index gezeigt. Sie verwendet die Anmerkungen @DynamoDBIndexHashKey und @DynamoDBIndexRangeKey, um den Partitions- und Sortierschlüssel des Index anzugeben.

Im folgenden Codebeispiel wird PostedBy-Message-Index gescannt. Er verwendet keinen Scan-Filter, sodass alle Elemente im Index an Sie zurückgegeben werden.

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false); List<PostedByMessage> iList = mapper.scan(PostedByMessage.class, scanExpression); Iterator<PostedByMessage> indexItems = iList.iterator();

scanPage

Scannt eine Tabelle oder einen sekundären Index und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der scan-Methode, können Sie optional einen FilterExpression festlegen, um den Ergebnissatz zu filtern. scanPage gibt jedoch nur die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt.

parallelScan

Führt einen parallelen Scan einer gesamten Tabelle oder einem sekundären Index durch. Sie geben eine Reihe von logischen Segmente für die Tabelle zusammen mit einem Scan-Ausdruck an, um Ergebnisse zu filtern. Der parallelScan teilt die Scan-Aufgabe unter mehreren Benutzern auf, einer für jedes logische Segment; die Benutzer verarbeiten die Daten parallel und geben die Ergebnisse zurück.

Im folgenden Java-Codebeispiel wird ein paralleler Scan der Tabelle Product ausgeführt.

int numberOfThreads = 4; Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":n", new AttributeValue().withN("100")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("Price <= :n") .withExpressionAttributeValues(eav); List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression, numberOfThreads);

batchSave

Speichert Objekte in eine oder mehrere Tabellen mithilfe eines Aufrufs oder mehrerer Aufrufe der Methode AmazonDynamoDB.batchWriteItem. Diese Methode bietet keine Transaktionsgarantien.

Der folgende Java-Code speichert zwei Elemente (Bücher) in der Tabelle ProductCatalog.

Book book1 = new Book(); book1.setId(901); book1.setProductCategory("Book"); book1.setTitle("Book 901 Title"); Book book2 = new Book(); book2.setId(902); book2.setProductCategory("Book"); book2.setTitle("Book 902 Title"); mapper.batchSave(Arrays.asList(book1, book2));

batchLoad

Ruft mehrere Elemente aus einer oder mehreren Tabellen anhand ihrer Primärschlüssel ab.

Der folgende Java-Code ruft zwei Elemente aus zwei verschiedenen Tabellen ab.

ArrayList<Object> itemsToGet = new ArrayList<Object>(); ForumItem forumItem = new ForumItem(); forumItem.setForumName("Amazon DynamoDB"); itemsToGet.add(forumItem); ThreadItem threadItem = new ThreadItem(); threadItem.setForumName("Amazon DynamoDB"); threadItem.setSubject("Amazon DynamoDB thread 1 message text"); itemsToGet.add(threadItem); Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);

batchDelete

Löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der AmazonDynamoDB.batchWriteItem-Methode. Diese Methode bietet keine Transaktionsgarantien.

Der folgende Java-Code löscht zwei Elemente (Bücher) aus der Tabelle ProductCatalog.

Book book1 = mapper.load(Book.class, 901); Book book2 = mapper.load(Book.class, 902); mapper.batchDelete(Arrays.asList(book1, book2));

batchWrite

Speichert Objekte in und löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der AmazonDynamoDB.batchWriteItem-Methode. Diese Methode bietet keine Transaktionsgarantien oder Versioning-Support (bedingte Ablege- oder Löschvorgänge).

Der folgende Java-Code schreibt ein neues Element in die Tabelle Forum, schreibt ein neues Element in die Tabelle Thread und löscht ein Element aus der Tabelle ProductCatalog.

// Create a Forum item to save Forum forumItem = new Forum(); forumItem.setName("Test BatchWrite Forum"); // Create a Thread item to save Thread threadItem = new Thread(); threadItem.setForumName("AmazonDynamoDB"); threadItem.setSubject("My sample question"); // Load a ProductCatalog item to delete Book book3 = mapper.load(Book.class, 903); List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem); List<Book> objectsToDelete = Arrays.asList(book3); mapper.batchWrite(objectsToWrite, objectsToDelete);

transactionWrite

Speichert Objekte in und löscht Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der AmazonDynamoDB.transactWriteItems-Methode.

Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactWriteItems

Weitere Informationen zu DynamoDB-Transaktionen und den bereitgestellten Atomaritäts-, Konsistenz-, Isolations- und Dauerhaftigkeitsgarantien (ACID) finden Sie unter Amazon DynamoDB Transactions.

Anmerkung

Diese Methode unterstützt Folgendes nicht:

Der folgende Java-Code schreibt transaktional jeweils ein neues Element in die Tabellen Forum und Thread.

Thread s3ForumThread = new Thread(); s3ForumThread.setForumName("S3 Forum"); s3ForumThread.setSubject("Sample Subject 1"); s3ForumThread.setMessage("Sample Question 1"); Forum s3Forum = new Forum(); s3Forum.setName("S3 Forum"); s3Forum.setCategory("Amazon Web Services"); s3Forum.setThreads(1); TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest(); transactionWriteRequest.addPut(s3Forum); transactionWriteRequest.addPut(s3ForumThread); mapper.transactionWrite(transactionWriteRequest);

transactionLoad

Lädt Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der AmazonDynamoDB.transactGetItems-Methode.

Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactGetItems

Weitere Informationen zu DynamoDB-Transaktionen und den bereitgestellten Atomaritäts-, Konsistenz-, Isolations- und Dauerhaftigkeitsgarantien (ACID) finden Sie unter Amazon DynamoDB Transactions.

Der folgende Java-Code lädt transaktional jeweils ein Element aus den Tabellen Forum und Thread.

Forum dynamodbForum = new Forum(); dynamodbForum.setName("DynamoDB Forum"); Thread dynamodbForumThread = new Thread(); dynamodbForumThread.setForumName("DynamoDB Forum"); TransactionLoadRequest transactionLoadRequest = new TransactionLoadRequest(); transactionLoadRequest.addLoad(dynamodbForum); transactionLoadRequest.addLoad(dynamodbForumThread); mapper.transactionLoad(transactionLoadRequest);

count

Bewertet den angegebenen Scanausdruck und gibt die Anzahl der übereinstimmenden Elemente zurück. Es werden keine Elementdaten zurückgegeben.

generateCreateTableAnfrage

Analysiert eine POJO Klasse, die eine DynamoDB-Tabelle darstellt, und gibt a CreateTableRequest für diese Tabelle zurück.

Erstellt einen Link zu einem Objekt in Amazon S3. Sie müssen einen Bucket-Namen und einen Schlüsselnamen angeben, welches das Objekt in dem Bucket eindeutig identifiziert.

Um createS3Link zu verwenden, muss die Mapper-Klasse die Methoden "Getter" und "Setter" definieren. Im folgenden Codebeispiel wird dies veranschaulicht, indem der Klasse CatalogItem ein neues Attribut und Getter/Setter-Methoden hinzugefügt werden.

@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { ... public S3Link productImage; .... @DynamoDBAttribute(attributeName = "ProductImage") public S3Link getProductImage() { return productImage; } public void setProductImage(S3Link productImage) { this.productImage = productImage; } ... }

Der folgende Java-Code definiert ein neues Element, das in die Tabelle Product geschrieben werden soll. Das Element enthält einen Link zu einemr Produktimage. Die Imagedaten werden auf Amazon S3 hochgeladen.

CatalogItem item = new CatalogItem(); item.setId(150); item.setTitle("Book 150 Title"); String myS3Bucket = "myS3bucket"; String myS3Key = "productImages/book_150_cover.jpg"; item.setProductImage(mapper.createS3Link(myS3Bucket, myS3Key)); item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg")); mapper.save(item);

Die S3Link-Klasse bietet viele andere Methoden für die Bearbeitung von Objekten in Amazon S3. Weitere Informationen finden Sie unter Javadocs for S3Link.

Ruft S3 ab ClientCache

Gibt den zugrunde liegenden S3ClientCache für den Zugriff auf Amazon S3 zurück. Ein S3ClientCache ist ein intelligentes Mapping für AmazonS3Client-Objekte. Wenn Sie mehrere Kunden haben, S3ClientCache kann Ihnen an dabei helfen, die Kunden nach AWS Regionen zu organisieren und bei Bedarf neue Amazon S3 S3-Clients zu erstellen.