【问题标题】:How to create a serial numbers autogenerated in dynamoDb using annotations如何使用注释创建在 dynamoDb 中自动生成的序列号
【发布时间】:2020-12-08 03:35:31
【问题描述】:

我在我的 java spring boot 应用程序中创建了一个 pojo 类,并带有用于创建/更新的相应注释,它工作正常,但是当我使用自动生成的密钥注释时,它正在创建一些随机 id,但我希望那些 id 列作为序列号.下面我给出了我的 pojo 类的注释

@DynamoDBHashKey(attributeName = "id")
@DynamoDBAutoGeneratedKey
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

生成的随机 Id 示例

5d2af735-62ce-47d4-85bf-8beece056eb

如何像我们在 SQL 自动增量标识列中那样生成带有序列号的自动生成列?

【问题讨论】:

    标签: spring-boot amazon-dynamodb aws-java-sdk-2.x aws-java-sdk-dynamodb


    【解决方案1】:

    不,您不能使用 DynamoDBAutoGeneratedKey 生成递增序列,它用于生成随机 UUID。

    在您的案例中生成的密钥“5d2af735-62ce-47d4-85bf-8beece056eb”是标准 UUID 格式,有助于在密钥空间中扩展和传播数据。

    https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html

    如果你想生成一个增量序列,你可以创建一个 SQL table "sequence_table",它只有 1 个列为“sequence_id”,设置为auto increment。 每当您想向 Dynamo 插入数据时,您可以先在 SQL 序列表中插入并获取最新的 id。使用此 id,您可以创建一个新的 Dynamodb 条目。如果没有使用注解DynamoDBAutoGeneratedKey,可以使用自己自定义的key值。当多个进程尝试向sequence_table添加新序列时,每个进程都会先对该表进行锁定,然后再插入一个新的id。所以这个解决方案也适用于分布式系统。

    但是,如果您的业务逻辑不关心 id 的顺序,则应仅使用 UUID,因为它具有高度可扩展性,因为不建议使用递增 1 的整数来生成哈希表的键。为了使表根据预置容量进行扩展,请求应均匀分布在分片中。

    由于序列中相邻的键将存储在相同的分区空间中。 此外,人们可能期望新用户比老用户更活跃,因此我们会将负载转向为最新用户行提供服务的分区。

    【讨论】:

    • “由于序列中相邻的键将存储在同一个分区空间中”——这实际上是不正确的。顺序 ID 无法很好扩展的原因是因为在分布式系统中很难大规模生成顺序 ID。另一方面,如果将它们用作键,DynamoDB 实际上会将顺序整数分配到不同的分区(这可以通过并行扫描来验证)
    • @MikeDinescu 是的,你是对的,这里详细讨论了同样的事情。如果有人感兴趣,他可以通过它。 forums.aws.amazon.com/thread.jspa?messageID=561190
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2018-12-03
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多