Azure的批量插入:错误的请求错误

问题描述:

我得到下面的错误,而试图插入Azure Table中存储多个实体:Azure的批量插入:错误的请求错误

com.microsoft.azure.storage.table.TableServiceException: Bad Request 
    at com.microsoft.azure.storage.table.TableBatchOperation$1.postProcessResponse(TableBatchOperation.java:525) 
    at com.microsoft.azure.storage.table.TableBatchOperation$1.postProcessResponse(TableBatchOperation.java:433) 
    at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:146) 

下面是批量插入Java代码:

public BatchInsertResponse batchInsert(BatchInsertRequest request){ 
    BatchInsertResponse response = new BatchInsertResponse(); 

    String erpName = request.getErpName(); 
    HashMap<String,List<TableEntity>> tableNameToEntityMap = request.getTableNameToEntityMap(); 

    HashMap<String,List<TableEntity>> errorMap = new HashMap<String,List<TableEntity>>(); 
    HashMap<String,List<TableEntity>> successMap = new HashMap<String,List<TableEntity>>();; 

    CloudTable cloudTable=null; 

    for (Map.Entry<String, List<TableEntity>> entry : tableNameToEntityMap.entrySet()){ 
     try { 
       cloudTable = azureStorage.getTable(entry.getKey());     
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     // Define a batch operation. 
      TableBatchOperation batchOperation = new TableBatchOperation(); 
      List<TableEntity> value = entry.getValue(); 

      for (int i = 0; i < value.size(); i++) { 
       TableEntity entity = value.get(i) ; 
       batchOperation.insertOrReplace(entity); 
       if (i!=0 && i % batchSize == 0) { 
        try { 
         cloudTable.execute(batchOperation); 
         batchOperation.clear(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 


       try { 
        cloudTable.execute(batchOperation); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
    } 

} 

以上代码工作正常,如果我将分配batchSize值为10,但如果我将分配给1000或100它会抛出错误的请求错误。

请帮我解决这个错误。我正在使用Spring引导和Azure存储Java SDK 4.3.0版。

+2

通常400错误意味着您的某个属性的值有问题。找出的一种方法是通过Fiddler跟踪请求/响应并查看正在发送的实际数据。有可能有一些数据类型不匹配。 – Aravind

+0

e.RequestInformation.HttpStatusMessage将为您提供失败的确切原因 – yonisha

+0

@Aravind我认为数据是正确的,因为我可以通过设置batchSize = 10来插入相同的数据。 – Sunil

正如Aravind所说,400错误通常意味着您的数据有问题。从this链接,实体批交易将失败,如果一个或多个下列条件不满足:

  • 所有受操作作为交易的一部分实体必须具有相同的PartitionKey值
  • 一个实体在交易中只能出现一次,并且只能对其执行一个操作。
  • 交易可以包括至多100个实体,其总有效载荷可能不超过4MB的大小
  • 所有实体都受到Understanding the Table Service Data Model中所述的限制。

请检查您的实体对这四条规则,并确保您没有违反规则之一。

+0

对于此批处理操作,我使用总计5行至少4000行的Azure表。因此数据有效载荷大于4MB。有什么方法可以使用超过4MB的有效载荷和超过100个实体进行单个事务? – Sunil

+0

不,你不能。这些是硬性限制,你不能覆盖它们。您需要将实体批次拆分为更小的批次,以便您不违反上述规则并单独尝试这些批次。 HTH。 –

+0

有没有什么方法可以找到批量数据有效载荷大小?所以我将能够确保每个批处理请求有效负载大小必须 Sunil