【问题标题】:Windows Azure Table Storage Take IssueWindows Azure 表存储问题
【发布时间】:2012-09-19 08:24:50
【问题描述】:

在 Windows Azure 表存储上,我正在执行下一个查询:

CloudTableClient ctc=TableStorage.getTableClient();
String q1=TableQuery.generateFilterCondition(TableConstants.PARTITION_KEY, QueryComparisons.EQUAL, Long.toHexString(partitionId));
TableQuery<Actividad> rangeQuery=TableQuery.from(tableName, Actividad.class).where(q1).take(2);
int e=0;
for(Actividad ac:ctc.execute(query)){
    e++;
}
System.out.println(e);

但我得到了分区上的所有行,而不仅仅是在 take(2) 上指定的前 2 行。

有什么建议吗?

回答smarx:

我使用 Wireshark 查看 http 请求:

初始请求是:

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&amp;$top=2&amp;timeout=60

服务有响应,然后发出大量请求:

GET /actividadreciente? $filter=PartitionKey%20eq%20%2717%27&amp;$top=2&amp;NextRowKey=1%2124%21RkZGRkZFQzY2REYzMTA3Mw--&amp;timeout=60&amp;NextPartitionKey=1%214%21MTc-

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&amp;$top=2&amp;NextRowKey=1%2124%21RkZGRkZFQzY3Mjk2MEZEOA--&amp;timeout=60&amp;NextPartitionKey=1%214%21MTc-

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&amp;$top=2&amp;NextRowKey=1%2124%21RkZGRkZFQzY3Mjk5MzVGOQ--&amp;timeout=60&amp;NextPartitionKey=1%214%21MTc-

等等。

【问题讨论】:

  • 这是用什么编程语言编写的?它使用的是什么库?
  • 它是 Java。 Windows Azure Java SDK。
  • 啊,谢谢。您是否使用过 Fiddler(或类似的 HTTP 调试代理)来查看从您的机器到存储服务的实际流量?我想知道是否缺少 $top 参数,或者是否正在发出多个请求(对结果进行分页)。两者都可能表明库中存在错误。
  • 我做到了。我编辑我的问题。我想这是一个库错误。你知道我该如何举报吗?
  • 如果不继续迭代会发生什么?我认为 execute() 返回一个迭代器,只要您请求它们(通过迭代),它就会不断获取新页面。如果您在获得要查找的两个实体后停止读取实体,我的猜测是只会发出一个查询。

标签: java azure-storage


【解决方案1】:

Smarx 是对的,可以遍历所有结果,但如果您只遍历前 2 个结果,则库只会对这些项目发出请求。使用附加请求进行后续迭代。所以解决方法是使用下面的代码:

CloudTableClient ctc=TableStorage.getTableClient();
final int limit=2;
String q1=TableQuery.generateFilterCondition(TableConstants.PARTITION_KEY, QueryComparisons.EQUAL, Long.toHexString(partitionId));
TableQuery<Actividad> rangeQuery=TableQuery.from(tableName, Actividad.class).where(q1).take(limit);
int e=0;
for(Actividad ac:ctc.execute(query)){
    e++;
    //Use ac
    if(e==limit)break;
}
System.out.println(e);

非常感谢 Smarx!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 2017-02-14
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多