Batch write to proces pozwalający na dodawanie i usuwanie wielu elementów jednocześnie. Metoda BatchWriteItem pozwala na dodawanie i usuwanie wielu elementów z jednej lub wielu tabel w jednym wywołaniu. Kroki, które są wymagane do wykonania te operacji (poza standardowymi) to utworzenie instancji klasy BatchWriteItemRequest wraz z opisem operacji (PUT lub DELETEBatchWriteItem z wykorzystaniem powyższego żądania jako parametru tej metody. Ostatni krok to sprawdzenie odpowiedzi – co mam na myśli? Powinniśmy sprawdzić czy w odpowiedzi są jakieś nieprzetworzone elementy żądania. Dodatkowo (o czym pisałem już wcześniej), DynamoDB ogranicza rozmiar żądania i liczbę operacji, które można określić w żądaniu. Jeżeli przekroczymy te limity dojdzie do odrzucenia żądania przez DynamoDB.
Mając w głowie poprzednie wpisy stwórzcie proszę dodatkową tabelę, niech to będzie np. Orders. W ramach naszego przykładu dodamy kolejny element do tabeli CarCatalog a w tym samym żądaniu do drugiej tabeli dodamy informacje o zamówieniach przy czym jedno z nich usuniemy, żeby sprawdzić możliwości metody BatchWriteItem. W kodzie możecie utworzyć sobie pomocniczą metodę do tworzenia nowych tabel gdzie podmienimy tylko nazwę tabeli i zdefiniujemy atybuty (spójrzcie poniżej):
private async Task<ActionResult<string>> CreateSampleTable()
{
var request = new CreateTableRequest
{
TableName = TableName3, // Podmieniamy nazwę parametru na 'kolejną tabelę'
AttributeDefinitions = new List<AttributeDefinition>() // określamy atrybuty
{
new AttributeDefinition
{
AttributeName = "Id",
AttributeType = "N"
},
new AttributeDefinition
{
AttributeName = "CarOrder",
AttributeType = "N"
},
new AttributeDefinition
{
AttributeName = "Message",
AttributeType = "S"
},
new AttributeDefinition
{
AttributeName = "KeywordTags",
AttributeType = "S"
}
},
KeySchema = new List<KeySchemaElement>
{
new KeySchemaElement
{
AttributeName = "Id",
KeyType = "HASH" // partition key
},
new KeySchemaElement
{
AttributeName = "ReplyDateTime",
KeyType = "RANGE" //sort key
}
},
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 10
}
};
var response = await _amazonDynamoDB.CreateTableAsync(request);
var tableDescription = response.TableDescription;
StringBuilder sb = new StringBuilder();
sb.AppendLine($"Tabela: {tableDescription.TableName} | Status: {tableDescription.TableStatus}");
sb.AppendLine($"ReadCapacityUnit: {tableDescription.ProvisionedThroughput.ReadCapacityUnits}");
sb.AppendLine($"WriteCapacityUnit: {tableDescription.ProvisionedThroughput.WriteCapacityUnits}");
WaitUntilTableReady(TableName3);
return sb.ToString();
}
Po wykonaniu powyższego kodu możemy sprawdzić czy rzeczywiście tabela została utworzona a my mamy do dyspozycji dwie tabele:
public async Task<ActionResult<string>> WriteItemBatch()
{
var request = new BatchWriteItemRequest()
{
RequestItems = new Dictionary<string, List<WriteRequest>>
{
{
TableName1, new List<WriteRequest>
{
new WriteRequest
{
PutRequest = new PutRequest
{
Item = new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue {N = "2"} },
{ "Brand", new AttributeValue {S = "Audi"} },
{ "Model", new AttributeValue{S = "R8"} },
{ "Color", new AttributeValue {S = "Progressive Red"} },
{ "Price", new AttributeValue { S = "1 064 000"} },
}
}
}
}
},
{
TableName2, new List<WriteRequest>
{
new WriteRequest
{
PutRequest = new PutRequest
{
Item = new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue {N = "1"} },
{ "CarOrder", new AttributeValue {N = "2"} },
{ "Message", new AttributeValue{S = "You order has beed completed!"} },
{ "KeywordTags", new AttributeValue {S = "Audi R8, Progressive Red, 1 064 000"} },
}
}
},
new WriteRequest
{
DeleteRequest = new DeleteRequest
{
Key = new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue {N = "2"} },
}
}
}
}
}
}
};
var response = await _amazonDynamoDB.BatchWriteItemAsync(request);
return Json(response);
}
Po wykonaniu powyższego kodu możemy zobaczyć, że wszystkie elementy zostały poprawnie przeprocesowane:
W kolejnym wpisie pobierzemy wiele elementów z jednej lub wielu tabel.