我有IEnumerable
我希望以最有效的方式添加到Azure Table。由于每个批处理写入都必须指向同一个PartitionKey,每次写入限制为100行......
有没有人想要实施这个"对" TODO部分引用的方式?我不确定为什么MSFT在这里没有完成任务......
此外,我不确定错误处理是否会使这个问题复杂化,或者实现它的正确方法。以下是Windows Azure "Tailspin Toys" demo
的Microsoft模式和实践团队的代码 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();
}
}
答案 0 :(得分:3)
嗯,我们(模式和实践团队)只是为了展示我们认为有用的其他东西而进行了优化。上面的代码实际上不是“通用库”,而是使用它的示例的特定方法。
在那一刻,我们认为添加额外的错误处理不会增加太多,我们喋喋不休地保持简单,但......我们可能错了。
无论如何,如果你按照// TODO:中的链接进行操作,你会发现我们编写的前一个指南的另一部分,它更多地讨论了“复杂”存储事务中的错误处理(不在“ACID”中)虽然Windows Azure存储中不支持事务“ala DTC”。
链接是这样的:http://msdn.microsoft.com/en-us/library/ff803365.aspx
这些限制更详细地列出:
添加一些额外的错误处理不应该过多地复杂化,而是取决于您在此基础上构建的应用程序类型以及您在应用程序堆栈中处理此更高或更低的偏好。在我们的示例中,应用程序永远不会期望&gt;无论如何,它只有100个实体,所以如果发生这种情况,它会简单地将异常冒泡(因为它应该是非常特殊的)。与总大小相同。在应用程序中实现的用例使得在同一个集合中不可能拥有相同的实体,所以再次,这应该永远不会发生(如果它发生,它只会抛出)
此处记录了所有“实体组事务”限制:http://msdn.microsoft.com/en-us/library/dd894038.aspx
让我们知道它是怎么回事!我也有兴趣知道指南的其他部分是否对你有用。