java - Azure 存储中的删除批量操作

标签 java azure-table-storage

我一直在尝试实现用于 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/

相关文章:

java - CreateTextNode转义大文本字符串中的字符

java - 将 mat 从 java 传递到 c++ jni android arm64-v8a 32/64 位的问题

c# - 提高此 Azure 表行计数查询的性能

用于容纳应用程序配置的 Azure 表存储

java - 玩WebSockets服务器推送示例

java - 如何在运行java web应用程序时查看堆性能?

java - 在 Neo4j 中,默认隔离级别始终是 READ_COMMITTED 还是仅在使用 Java 扩展它时才出现这种情况?

azure - 一个具有许多分区键的 Azure 表存储表与许多具有较少分区键的表相比如何?

Azure 流分析将 int64 输出为 int32

azure - 在 azure 表存储中创建分区键以存储传感器输出数据的最佳方法是什么?