spring-boot - 如何使用注释创建在 dynamoDb 中自动生成的序列号
问题描述
我在我的 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 自动增量标识列中那样生成带有序列号的自动生成列?
解决方案
不,您不能使用 DynamoDBAutoGeneratedKey 生成递增序列,它用于生成随机 UUID。
在您的情况下生成的密钥“5d2af735-62ce-47d4-85bf-8beece056eb”是标准 UUID 格式,这将有助于在密钥空间中扩展和传播数据。
https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html
如果你想生成一个增量序列,你可以做的是创建一个SQL 表“ sequence_table ”,它只有 1 列作为“ sequence_id ”,它被设置为自动增量。每当您想向 Dynamo 插入数据时,您可以先在 SQL 序列表中插入并获取最新的 id。使用此 id,您可以创建一个新的 Dynamodb 条目。如果没有使用注解DynamoDBAutoGeneratedKey,可以使用自己自定义的key值。当多个进程尝试向sequence_table添加新序列时,每个进程都会先对该表进行锁定,然后再插入一个新的id。所以这个解决方案也适用于分布式系统。
但是,附带说明一下,如果您的业务逻辑不关心 id 的顺序,您应该只使用 UUID,因为它具有高度可扩展性,因为不建议使用递增 1 的整数来生成桌子。为了使表根据预置容量进行扩展,请求应均匀分布在分片中。
由于序列中相邻的键将存储在相同的分区空间中。此外,人们可能期望新用户比老用户更活跃,因此我们会将负载转向为最新用户行提供服务的分区。
推荐阅读
- mysql - 我无法将从数据库中提取的数据导出为 Node.JS 中的 Excel (.csv) 或 (xlsx) 格式
- php - laravel,从 URL 参数自动填充表单字段
- javascript - 打字稿 | 关于缺少函数返回类型 ESLint 的警告
- apache-spark - 为什么没有 collect() 对累加器的操作不起作用?
- javascript - Knockout.Js 中的多个 afterAdd 调用
- javascript - 如何从从 nodejs 服务器获取的缓冲区数据中显示视频
- git - 仅将 TFS 存储库的一部分迁移到 Azure DevOps 上的 Git
- python - 当并非所有行都包含结束日期时,对数据框中的开始日期和结束日期进行数学运算
- java - 在 Java 中使用 SecureRandom
- amazon-web-services - 通过 CLI 删除 S3 存储桶中的空文件夹