As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Use extensões para personalizar as operações do DynamoDB Enhanced Client
A API do Cliente Aprimorado do DynamoDB fornece suporte a extensões de complemento que fornecem funcionalidades além das operações de mapeamento. As extensões usam dois métodos de gancho para modificar dados durante as operações de leitura e gravação:
beforeWrite()
- Modifica uma operação de gravação antes que ela aconteçaafterRead()
- Modifica os resultados de uma operação de leitura depois que ela acontece
Algumas operações (como atualizações de itens) realizam uma gravação e depois uma leitura, então os dois métodos de gancho são chamados.
Como as extensões são carregadas
As extensões são carregadas na ordem especificada no construtor de clientes aprimorado. A ordem de carregamento pode ser importante porque uma extensão pode atuar em valores que foram transformados por uma extensão anterior.
Por padrão, o cliente aprimorado carrega duas extensões:
VersionedRecordExtension
- Proporciona um bloqueio otimistaAtomicCounterExtension
- Incrementa automaticamente os atributos do contador
Você pode substituir o comportamento padrão com o construtor de clientes aprimorado e carregar qualquer extensão. Você também pode especificar nenhuma se não quiser as extensões padrão.
Importante
Se você carregar suas próprias extensões, o cliente aprimorado não carregará nenhuma extensão padrão. Se você quiser o comportamento fornecido por uma extensão padrão, precisará adicioná-la explicitamente à lista de extensões.
O exemplo a seguir mostra como carregar uma extensão personalizada com o verifyChecksumExtension
nome deVersionedRecordExtension
. A AtomicCounterExtension
não está carregada neste exemplo.
DynamoDbEnhancedClientExtension versionedRecordExtension = VersionedRecordExtension.builder().build(); DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(dynamoDbClient) .extensions(versionedRecordExtension, verifyChecksumExtension) .build();
Detalhes e configuração da extensão disponível
As seções a seguir fornecem informações detalhadas sobre cada extensão disponível no SDK.
Implemente um bloqueio otimista com o VersionedRecordExtension
A VersionedRecordExtension
extensão fornece bloqueio otimista incrementando e rastreando o número da versão de um item à medida que os itens são gravados no banco de dados. Uma condição é adicionada a cada gravação que faz com que a gravação falhe se o número da versão do item real persistido não corresponder ao valor que o aplicativo leu pela última vez.
Configuração
Para especificar qual atributo usar para rastrear o número da versão do item, marque um atributo numérico no esquema da tabela.
O trecho a seguir especifica que o atributo version
deve conter o número da versão do item.
@DynamoDbVersionAttribute public Integer getVersion() {...}; public void setVersion(Integer version) {...};
A abordagem equivalente do esquema de tabela estática é mostrada no trecho a seguir.
.addAttribute(Integer.class, a -> a.name("version") .getter(Customer::getVersion) .setter(Customer::setVersion) // Apply the 'version' tag to the attribute. .tags(VersionedRecordExtension.AttributeTags.versionAttribute())
Como funciona
O bloqueio otimista com o VersionedRecordExtension
tem o seguinte impacto nesses DynamoDbEnhancedClient
e DynamoDbTable
nos métodos:
putItem
-
Novos itens recebem um valor de versão inicial de 0. Isso pode ser configurado com
@DynamoDbVersionAttribute(startAt =
.X
) updateItem
-
Se você recuperar um item, atualizar uma ou mais de suas propriedades e tentar salvar as alterações, a operação será bem-sucedida somente se o número da versão no lado do cliente e no lado do servidor corresponderem.
Se for bem-sucedido, o número da versão será automaticamente incrementado em 1. Isso pode ser configurado com
@DynamoDbVersionAttribute(incrementBy =
.X
) deleteItem
-
A
DynamoDbVersionAttribute
anotação não tem efeito. Você deve adicionar uma expressão de condição manualmente ao excluir um item.O exemplo a seguir adiciona uma expressão condicional para garantir que o item excluído seja o item que foi lido. No exemplo a seguir
recordVersion
está o atributo do bean anotado com.@DynamoDbVersionAttribute
// 1. Read the item and get its current version. Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build()); // `recordVersion` is the bean's attribute that is annotated with `@DynamoDbVersionAttribute`. AttributeValue currentVersion = item.getRecordVersion(); // 2. Create conditional delete with the `currentVersion` value. DeleteItemEnhancedRequest deleteItemRequest = DeleteItemEnhancedRequest.builder() .key(KEY) .conditionExpression(Expression.builder() .expression("recordVersion = :current_version_value") .putExpressionValue(":current_version_value", currentVersion) .build()).build(); customerTable.deleteItem(deleteItemRequest);
transactWriteItems
-
-
addPutItem
: Esse método tem o mesmo comportamento deputItem
. -
addUpdateItem
: Esse método tem o mesmo comportamento deupdateItem
. -
addDeleteItem
: Esse método tem o mesmo comportamento dedeleteItem
.
-
batchWriteItem
-
-
addPutItem
: Esse método tem o mesmo comportamento deputItem
. -
addDeleteItem
: Esse método tem o mesmo comportamento dedeleteItem
.
-
nota
As tabelas globais do DynamoDB usam uma reconciliação de “último escritor ganha” entre atualizações simultâneas, em que o DynamoDB se esforça ao máximo para determinar o último gravador. Se você usa tabelas globais, essa política de “último escritor vence” significa que as estratégias de bloqueio podem não funcionar conforme o esperado, pois todas as réplicas acabarão por convergir com base na última gravação determinada pelo DynamoDB.
Como desativar
Para desativar o bloqueio otimista, não use a anotação. @DynamoDbVersionAttribute
Implemente contadores com o AtomicCounterExtension
A AtomicCounterExtension
extensão incrementa um atributo numérico marcado sempre que um registro é gravado no banco de dados. Você pode especificar valores iniciais e de incremento. Se nenhum valor for especificado, o valor inicial será definido como 0 e o valor do atributo será incrementado em 1.
Configuração
Para especificar qual atributo é um contador, marque um atributo do tipo Long
no esquema da tabela.
O trecho a seguir mostra o uso dos valores padrão de início e de incremento para o atributo counter
.
@DynamoDbAtomicCounter public Long getCounter() {...}; public void setCounter(Long counter) {...};
A abordagem do esquema de tabela estática é mostrada no trecho a seguir. A extensão do contador atômico usa um valor inicial de 10 e incrementa o valor em 5 cada vez que o registro é gravado.
.addAttribute(Integer.class, a -> a.name("counter") .getter(Customer::getCounter) .setter(Customer::setCounter) // Apply the 'atomicCounter' tag to the attribute with start and increment values. .tags(StaticAttributeTags.atomicCounter(10L, 5L))
Adicione carimbos de data/hora com o AutoGeneratedTimestampRecordExtension
A AutoGeneratedTimestampRecordExtension
extensão atualiza automaticamente os atributos marcados do tipo Instant
com um carimbo de data/hora atual sempre que o item é gravado com sucesso no banco de dados. Essa extensão não é carregada por padrão.
Configuração
Para especificar qual atributo atualizar com o carimbo de data/hora atual, marque o atributo Instant
no esquema da tabela.
O lastUpdate
atributo é o alvo do comportamento da extensão no trecho a seguir. Observe a exigência de que o atributo seja um tipo Instant
.
@DynamoDbAutoGeneratedTimestampAttribute public Instant getLastUpdate() {...} public void setLastUpdate(Instant lastUpdate) {...}
A abordagem equivalente do esquema de tabela estática é mostrada no trecho a seguir.
.addAttribute(Instant.class, a -> a.name("lastUpdate") .getter(Customer::getLastUpdate) .setter(Customer::setLastUpdate) // Applying the 'autoGeneratedTimestamp' tag to the attribute. .tags(AutoGeneratedTimestampRecordExtension.AttributeTags.autoGeneratedTimestampAttribute())
Gere um UUID com o AutoGeneratedUuidExtension
A AutoGeneratedUuidExtension
extensão gera um UUID (Identificador Único Universal) exclusivo para um atributo quando um novo registro é gravado no banco de dados. Usa o método Java JDK UUID.randomUIDjava.lang.String
Essa extensão não é carregada por padrão.
Configuração
O uniqueId
atributo é o alvo do comportamento da extensão no trecho a seguir.
@AutoGeneratedUuidExtension public String getUniqueId() {...} public void setUniqueId(String uniqueId) {...}
A abordagem equivalente do esquema de tabela estática é mostrada no trecho a seguir.
.addAttribute(String.class, a -> a.name("uniqueId") .getter(Customer::getUniqueId) .setter(Customer::setUniqueId) // Applying the 'autoGeneratedUuid' tag to the attribute. .tags(AutoGeneratedUuidExtension.AttributeTags.autoGeneratedUuidAttribute())
Se você quiser que a extensão preencha o UUID somente para putItem
métodos e não para updateItem
métodos, adicione a anotação de comportamento de atualização
@AutoGeneratedUuidExtension @DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS) public String getUniqueId() {...} public void setUniqueId(String uniqueId) {...}
Se você usar a abordagem de esquema de tabela estática, use o código equivalente a seguir.
.addAttribute(String.class, a -> a.name("uniqueId") .getter(Customer::getUniqueId) .setter(Customer::setUniqueId) // Applying the 'autoGeneratedUuid' tag to the attribute. .tags(AutoGeneratedUuidExtension.AttributeTags.autoGeneratedUuidAttribute(), StaticAttributeTags.updateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS))