Amazon dynamodb DynamoDBMapper加载与查询

Amazon dynamodb DynamoDBMapper加载与查询,amazon-dynamodb,Amazon Dynamodb,DynamoDBMapper提供了从表中读取一项的不同方法: 质疑 装载 是否有建议,使用哪一种?在快速测试中,以下两个代码段对于主键为hash、范围键为date的表返回相同的“MyEntry”项,而查询方法的速度大约快10% 加载 public MyEntry getEntryForDay(最终整数散列,最终LocalDate){ 返回mapper.load(MyEntry.class、哈希、日期); } 查询 public MyEntry getEntryForDay(最终整数散列,最

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

  • 质疑
  • 装载
是否有建议,使用哪一种?在快速测试中,以下两个代码段对于主键为hash、范围键为date的表返回相同的“MyEntry”项,而查询方法的速度大约快10%

加载

public MyEntry getEntryForDay(最终整数散列,最终LocalDate){
返回mapper.load(MyEntry.class、哈希、日期);
}
查询

public MyEntry getEntryForDay(最终整数散列,最终LocalDate){
最终MyEntry hashKeyValues=新的MyEntry();
setHash(hash);
最终条件rangeKeyCondition=新条件()//
.withComparisonOperator(ComparisonOperator.EQ.toString())//
.WithAttributeValue列表(新的AttributeValue().With(新的LocalDateMarshaller().marshall(日期)));
最终DynamoDBQueryExpression queryExpression=新DynamoDBQueryExpression()//
.withHashKeyValues(hashKeyValues)//
.withRangeKeyCondition(“日期”,rangeKeyCondition)//
.有限制(1);
最终列表storedEntries=mapper
.query(MyEntry.class,queryExpression);
if(storedEntries.size()=0){
返回null;
}
返回storedEntries.get(0);
}

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

如果您有一个只有散列键的模式,它们将执行相同的操作—使用指定的散列键检索项

如果您有一个哈希范围模式,load将检索由单个哈希+范围对标识的特定项。查询检索具有指定哈希键且满足范围键条件的所有项


由于对散列键和范围键都使用相等运算符,因此操作完全等效。

好的,现在随着我越来越习惯于使用DynamoDB,结果发现mapper.query代码中的一个错误导致性能下降:

  • “withLimit(1)”实际上并不限制列表中返回的总结果,而是将结果返回到“PaginatedQueryList”中,如果访问,则实际项目将从DB延迟加载。WithLimit(1)实际上限制了每个请求加载的项目
  • 实际的bug是“if(storedEntries.size()==0)”部分,因为size()调用实际上加载了列表中的所有项目。对于withLimit(1),这将导致性能最差
映射器查询的正确代码为:

public MyEntry getEntryForDay(最终整数散列,最终LocalDate){
最终MyEntry hashKeyValues=新的MyEntry();
setHash(hash);
最终条件rangeKeyCondition=新条件()//
.withComparisonOperator(ComparisonOperator.EQ.toString())//
.WithAttributeValue列表(新的AttributeValue().With(新的LocalDateMarshaller().marshall(日期)));
最终DynamoDBQueryExpression queryExpression=新DynamoDBQueryExpression()//
.withHashKeyValues(hashKeyValues)//
.withRangeKeyCondition(“日期”,rangeKeyCondition)//
.有限制(1);
最终列表storedEntries=mapper
.query(MyEntry.class,queryExpression);
if(storedEntries.isEmpty()){
返回null;
}
返回storedEntries.get(0);
}

“大约快10%”。您是如何对这些进行基准测试的?你的测量是什么?我没有正确地进行基准测试,只是做了一次时间测量。使用mapper.load插入样本表需要90毫秒,使用mapper.query插入样本表需要110毫秒。