我一直在尝试实现用于 Azure 存储实体的删除操作的 DAO 方法。使用TableOperation删除就可以了。
TableOperation deleteEntity = TableOperation.delete(entity);
但是当我尝试使用批量操作时,它不被支持。
非常感谢任何解决此问题的建议。
最佳答案
But when I tried it using Batch Operation, It was not supported.
我假设您可以按分区键对要删除的项目进行分组,然后执行 TableBatchOperation
。
这里我用C#语言写了一个helper类来实现这个目的,你可以引用一下:
public class TableBatchHelper<T> where T : ITableEntity
{
const int batchMaxSize = 100;
public static IEnumerable<TableBatchOperation> GetBatchesForDelete(IEnumerable<T> items)
{
var list = new List<TableBatchOperation>();
var partitionGroups = items.GroupBy(arg => arg.PartitionKey).ToArray();
foreach (var group in partitionGroups)
{
T[] groupList = group.ToArray();
int offSet = batchMaxSize;
T[] entities = groupList.Take(offSet).ToArray();
while (entities.Any())
{
var tableBatchOperation = new TableBatchOperation();
foreach (var entity in entities)
{
tableBatchOperation.Add(TableOperation.Delete(entity));
}
list.Add(tableBatchOperation);
entities = groupList.Skip(offSet).Take(batchMaxSize).ToArray();
offSet += batchMaxSize;
}
}
return list;
}
public static async Task BatchDeleteAsync(CloudTable table, IEnumerable<T> items)
{
var batches = GetBatchesForDelete(items);
await Task.WhenAll(batches.Select(table.ExecuteBatchAsync));
}
}
然后,您可以按如下方式执行批量删除:
await TableBatchHelper<ClassName>.BatchDeleteAsync(cloudTable,items);
或者
var batches = TableBatchHelper<ClassName>.GetBatchesForDelete(entities);
Parallel.ForEach(batches, new ParallelOptions()
{
MaxDegreeOfParallelism = 5
}, (batchOperation) =>
{
try
{
table.ExecuteBatch(batchOperation);
Console.WriteLine("Writing {0} records", batchOperation.Count);
}
catch (Exception ex)
{
Console.WriteLine("ExecuteBatch throw a exception:" + ex.Message);
}
});
关于java - Azure 存储中的删除批量操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945638/