使用 DynamoMapper 和类 Annotation 创建具有全局二级索引的表

Posted

技术标签:

【中文标题】使用 DynamoMapper 和类 Annotation 创建具有全局二级索引的表【英文标题】:Create table with Global secondary index using DynamoMapper and class Annotation 【发布时间】:2016-08-17 11:06:15 【问题描述】:

我目前正在使用 Java dynamoMapper 来创建和查询表。尝试使用全局二级索引创建表时,出现以下错误

没有为全局二级索引指定预置吞吐量

代表表的 java 类具有全局二级索引的此属性。

@DynamoDBIndexHashKey(globalSecondaryIndexName="sender")
    public String getSender() 
    return sender;

创建表的类如下所示

public boolean createTable() 
try 
DynamoDBMapper mapper = new DynamoDBMapper(client);
CreateTableRequest tableRequest =     mapper.generateCreateTableRequest(entityClass); // 1
tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1000L, 1500L)); // 2
client.createTable(tableRequest); // 3

     catch (Error e) 
        e.printStackTrace();
        return false;

     catch (Exception e) 
        e.printStackTrace();
        return false;
    
    return true;

我在亚马逊网站上搜索了额外的注释和配置,但没有找到 DynamoMapper。无论如何要使用 ORM 来执行此操作,还是我必须使用较低级别的 API 手动创建?

【问题讨论】:

【参考方案1】:

您还需要在将生成的每个二级索引表上设置预置吞吐量。

tableRequest.getGlobalSecondaryIndexes().get(0).setProvisionedThroughput(new ProvisionedThroughput(10l, 10l));

【讨论】:

【参考方案2】:

@Jeremy 答案的扩展。

如果您有多个 GSI,那么您可以像下面这样操作。如果它们具有相同的值,您也不需要一直创建 ProvisionedThroughput 对象。

 final ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput(5L, 5L);
 createRequest.setProvisionedThroughput(provisionedThroughput);
 createRequest.getGlobalSecondaryIndexes().forEach(v -> v.setProvisionedThroughput(provisionedThroughput));

【讨论】:

以上是关于使用 DynamoMapper 和类 Annotation 创建具有全局二级索引的表的主要内容,如果未能解决你的问题,请参考以下文章

使用EventBus,debug时不报错,release版本报错:its super classes have no public methods with the @Subscribe annota

使用EventBus,debug时不报错,release版本报错:its super classes have no public methods with the @Subscribe annota

解决:Unable to identify index name. XXXModel is not a Document. Make sure the document class is annota

如何使用命名空间和类?

使用向量和类

接口和类的使用案例