DynamoDBMapper加载与查询

时间:2015-08-06 07:59:38

标签: amazon-dynamodb

DynamoDBMapper提供了从表中读取一个项目的不同方法:

  • 查询
  • 负载

是否有推荐,哪些可以使用?在快速测试中,以下两个代码片段返回相同的" MyEntry"具有主键=哈希和范围键=日期的表的项目,而查询方法大约快10%。

负载

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    return mapper.load(MyEntry.class, hash, date);
}

查询

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    final MyEntry hashKeyValues = new MyEntry ();
    hashKeyValues.setHash(hash);
    final Condition rangeKeyCondition = new Condition()//
            .withComparisonOperator(ComparisonOperator.EQ.toString())//
            .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date)));
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()//
            .withHashKeyValues(hashKeyValues)//
            .withRangeKeyCondition("date", rangeKeyCondition)//
            .withLimit(1);
    final List<MyEntry> storedEntries = mapper
            .query(MyEntry.class, queryExpression);
    if (storedEntries.size() == 0) {
        return null;
    }
    return storedEntries.get(0);
}

2 个答案:

答案 0 :(得分:8)

加载和查询是不同的操作:

如果你有一个只有散列键的模式,它们会执行相同的操作 - 使用指定的散列键检索项目。

如果您有散列范围架构,则load会检索由单个散列+范围对标识的特定项。查询检索具有指定哈希键并满足范围键条件的所有项目。

由于您对哈希键和范围键都使用了相等运算符,因此操作完全相同。

答案 1 :(得分:3)

好的,现在随着我越来越习惯使用DynamoDB,事实证明mapper.query代码中的错误导致性能更差:

  • &#34; withLimit(1)&#34;实际上并不限制列表中返回的总结果,而是在&#34; PaginatedQueryList&#34;中返回结果。如果访问,实际项目将从数据库延迟加载。 WithLimit(1)实际上限制了每个请求加载的项目。
  • 实际的错误是部分&#34; if(storedEntries.size()== 0)&#34 ;,因为size()调用实际上加载了列表中的所有项目。使用withLimit(1)可以获得最差的性能。

映射器查询的正确代码是:

public MyEntry getEntryForDay(final Integer hash, final LocalDate date) {
    final MyEntry hashKeyValues = new MyEntry ();
    hashKeyValues.setHash(hash);
    final Condition rangeKeyCondition = new Condition()//
            .withComparisonOperator(ComparisonOperator.EQ.toString())//
            .withAttributeValueList(new AttributeValue().withS(new LocalDateMarshaller().marshall(date)));
    final DynamoDBQueryExpression<MyEntry> queryExpression = new DynamoDBQueryExpression<MyEntry>()//
            .withHashKeyValues(hashKeyValues)//
            .withRangeKeyCondition("date", rangeKeyCondition)//
            .withLimit(1);
    final List<MyEntry> storedEntries = mapper
            .query(MyEntry.class, queryExpression);
    if (storedEntries.isEmpty()) {
        return null;
    }
    return storedEntries.get(0);
}