1

IEnumerable想以最有效的方式将其添加到 Azure Table。由于每次批量写入都必须指向相同的 PartitionKey,每次写入限制为 100 行...

有没有人想尝试以 TODO 部分中提到的“正确”方式来实现这一点?我不确定为什么 MSFT 没有在这里完成任务......

另外我不确定错误处理是否会使这复杂化,或者实现它的正确方法。这是来自 Microsoft 模式和实践团队的代码,用于 Windows Azure “Tailspin Toys”演示

    public void Add(IEnumerable<T> objs)
    {
        // todo: Optimize: The Add method that takes an IEnumerable parameter should check the number of items in the batch and the size of the payload before calling the SaveChanges method with the SaveChangesOptions.Batch option. For more information about batches and Windows Azure table storage, see the section, "Transactions in aExpense," in Chapter 5, "Phase 2: Automating Deployment and Using Windows Azure Storage," of the book, Windows Azure Architecture Guide, Part 1: Moving Applications to the Cloud, available at http://msdn.microsoft.com/en-us/library/ff728592.aspx.

        TableServiceContext context = this.CreateContext();

        foreach (var obj in objs)
        {
            context.AddObject(this.tableName, obj);
        }

        var saveChangesOptions = SaveChangesOptions.None;
        if (objs.Distinct(new PartitionKeyComparer()).Count() == 1)
        {
            saveChangesOptions = SaveChangesOptions.Batch;
        }

        context.SaveChanges(saveChangesOptions);
    }


   private class PartitionKeyComparer : IEqualityComparer<TableServiceEntity>
    {
        public bool Equals(TableServiceEntity x, TableServiceEntity y)
        {
            return string.Compare(x.PartitionKey, y.PartitionKey, true, System.Globalization.CultureInfo.InvariantCulture) == 0;
        }

        public int GetHashCode(TableServiceEntity obj)
        {
            return obj.PartitionKey.GetHashCode();
        }
    }
4

1 回答 1

3

好吧,我们(模式和实践团队)刚刚优化显示其他我们认为有用的东西。上面的代码并不是真正的“通用库”,而是使用它的示例的特定方法。

那时我们认为添加额外的错误处理不会增加太多,我们决定保持简单,但是....我们可能错了。

无论如何,如果您点击 //TODO: 中的链接,您会发现我们之前编写的指南的另一部分,该部分更多地讨论了“复杂”存储事务中的错误处理(虽然不是“ACID”形式,但Windows Azure 存储不支持事务“ala DTC”)。

链接是这样的:http: //msdn.microsoft.com/en-us/library/ff803365.aspx

那里更详细地列出了这些限制:

  • 批次中应仅存在一个实体实例
  • 最多 100 个实体或 4 MB 有效负载
  • 相同的 PartitionKey(正在代码中处理:请注意,只有在有单个 Partition 键时才指定“batch”)
  • 等等

添加一些额外的错误处理不应使事情过于复杂,但取决于您在此之上构建的应用程序类型以及您在应用程序堆栈中处理更高或更低级别的偏好。在我们的示例中,应用程序永远不会期望超过 100 个实体,因此如果发生这种情况,它会简单地将异常冒泡(因为它应该是真正的异常)。与总大小相同。应用程序中实现的用例使得在同一个集合中不可能有相同的实体,所以再一次,这不应该发生(如果发生,它会简单地抛出)

所有“实体组事务”限制都记录在这里:http: //msdn.microsoft.com/en-us/library/dd894038.aspx

让我们知道怎么回事!我也很想知道该指南的其他部分是否对您有用。

于 2011-02-23T01:20:30.893 回答