在Java中创建新的DynamoDB表时,请使用DynamoDBVersionAttribute

时间:2018-10-10 00:43:38

标签: amazon-web-services amazon-dynamodb optimistic-locking

我正在尝试添加DynamoDBVersionAttribute以在访问/更新DynamoDB表中的项目时合并乐观锁定。但是,我无法弄清楚究竟如何添加version属性。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html似乎表明使用它作为创建表的类中的注释是可行的方法。但是,我们的代码库正在以类似于以下格式创建新表:

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
DynamoDB dynamoDB = new DynamoDB(client);

List<AttributeDefinition> attributeDefinitions= new 
ArrayList<AttributeDefinition>();
attributeDefinitions.add(new 
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));

List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
keySchema.add(new 
KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH));

CreateTableRequest request = new CreateTableRequest()
    .withTableName(tableName)
    .withKeySchema(keySchema)
    .withAttributeDefinitions(attributeDefinitions)
    .withProvisionedThroughput(new ProvisionedThroughput()
        .withReadCapacityUnits(5L)
        .withWriteCapacityUnits(6L));

Table table = dynamoDB.createTable(request);

如上所述,我无法找到如何通过Java代码添加VersionAttribute的方法。它不是属性定义,因此不确定其去向。关于在哪里可以在CreateTable请求中添加此VersionAttribute的任何指导?

2 个答案:

答案 0 :(得分:2)

据我所知,用于乐观锁定的@DynamoDBVersionAttribute批注仅适用于专门为DynamoDBMapper查询建模的表。使用DynamoDBMapper并不是一个糟糕的方法,因为它有效地为DynamoDB项目上的CRUD操作创建了ORM。

但是,如果您现有的代码库无法利用它,那么您的下一个最佳选择可能是使用条件写入来增加版本号(如果它等于您期望的版本号)(即,滚动自己的乐观锁定)。不幸的是,您需要在希望乐观锁定的每个写入中包括增量/条件。

答案 1 :(得分:1)

您的代码仅创建一个表,但是为了使用DynamoDBMapper访问该表,您需要创建一个表示该表的类。例如,如果您的表名为Users,则应创建一个名为Users的类,并使用批注将其链接到表。

您可以保留表创建代码,但是需要创建DynamoDBMapper类。然后,您可以使用DynamoDBMapper类完成所有的加载,保存和查询。

创建类后,只需给它一个名为version的字段并在其上添加注释,DynamoDBMapper将负责其余的工作。