Spring Data DynamoDB中@DynamoDBIndexHashKey注解引发查询失败及疑问
Spring Data DynamoDB中@DynamoDBIndexHashKey的使用说明
何时需要使用@DynamoDBIndexHashKey?
当你需要通过Spring Data Repository的自定义方法,直接基于全局二级索引(GSI)的哈希键进行查询操作时,必须给对应字段标注这个注解。
比如你的Repository定义了List<SecretEntity> findByContractUuid(String contractUuid);这类方法,Spring Data需要通过@DynamoDBIndexHashKey(globalSecondaryIndexName = "secretContractUuid")来识别该字段关联的GSI,从而生成针对这个GSI的Query请求——这才是利用GSI快速定位数据的正确方式。
如果不标注这个注解,Spring Data会默认把查询指向主表,尝试在主表中查找contractUuid字段的值,不会触发GSI的使用。
不使用该注解会有性能问题吗?
会,且数据量越大问题越明显:
- 如果
contractUuid不是主表的主键(哈希/排序键),也没有其他本地二级索引,不使用@DynamoDBIndexHashKey的查询会触发全表扫描。全表扫描需要遍历主表所有数据,耗时随数据量线性增长,同时消耗大量读取容量单位(RCU),既慢又增加成本。 - 只有当你的查询逻辑本来就需要扫描主表全部数据时,全表扫描才合理,但这显然不是你创建GSI的初衷。
关于你遇到的权限错误
你用@DynamoDBIndexHashKey时触发AccessDeniedException,本质是IAM权限配置问题:
- 标注该注解后,Spring Data会发起针对GSI
secretContractUuid的Query请求,你的IAM角色需要拥有该GSI的dynamodb:Query权限(资源需包含GSI的ARN,格式类似arn:aws:dynamodb:区域:账号ID:table/表名/index/secretContractUuid)。 - 改用
@DynamoDBAttribute后,查询走主表的全表扫描,此时只需要主表的dynamodb:Scan权限,而你的角色刚好具备这个权限,所以能正常执行。
内容的提问来源于stack exchange,提问作者alaptiko
相关产品推荐
相关产品推荐

