【问题标题】:DynamoDB Transactions : Write to different tables with dynamic namesDynamoDB 事务:写入具有动态名称的不同表
【发布时间】:2021-11-03 10:09:11
【问题描述】:

我正在尝试在 Kotlin 中为 DynamoDB 使用事务性写入。

用例: 我想在同一个事务中将两个不同的对象写入两个不同的表。例如 : 将AClass写入表1,将BClass写入表2。

如果每个场景的 Table1 和 Table2 的名称都相同,这将很简单。

但是,我使用的是无服务器框架,具体取决于指定的阶段,

Table1 可以是:local-Table1 / dev-Table1 / production-Table1

表 2 相同

但是,在我的 AClass 类声明中,如果我尝试使用 @DynamoDBTable(tableName = "$stage-Table1") 注释 AClass,则会收到错误 An annotation argument must be a compile-time constant.

这意味着需要在流程中单独提供表名。为了在通常的写入/获取场景中克服这个问题,我使用了以下设置:

private val dynamoDBMapperConfig = DynamoDBMapperConfig.Builder()
        .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(tableName))
        .build()

mapper.save(t, dynamoDBMapperConfig)

根据文档,我必须执行以下操作:

TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest()
transactionWriteRequest.addPut(aClassObject)
transactionWriteRequest.addPut(bClassObject)
mapper.transactionWrite(transactionWriteRequest)

如果将 AClassBClass 的对象写入同一个表中,我可以再次使用自定义 DynamoDBMapperConfig。但是,这两个对象都需要写在两个不同的表中,并且由于需要在运行时解析表名,所以我不能将它们作为 Class 注释的一部分。

我该如何解决这个问题? (我想使用对象映射器)

【问题讨论】:

    标签: kotlin amazon-dynamodb serverless objectmapper


    【解决方案1】:

    我正在使用自定义 DynamoDB 映射器在运行时更改表名,因为每个环境中的表名都不同。

    表格:

    @DynamoDBTable(tableName="dummy-table-Name")
    public class DynamoTable
    

    动态表名的自定义映射器

    DynamoDBMapperConfig.TableNameOverride tableNameOverriderride = new DynamoDBMapperConfig.TableNameOverride("DYNAMIC_TABLE_NAME");
    DynamoDBMapperConfig config =new DynamoDBMapperConfig(tableNameOverriderride);
    DynamoDBMapper mapper =new DynamoDBMapper(client, config);
    

    使用上述映射器执行 CRUD 操作:

    DynamoTable dynamoTable = mapper.load(DynamoTable.class, id);
    
    mapper.save(dynamoTable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      相关资源
      最近更新 更多