2016-07-31 119 views
2

我得到下面的錯誤,而試圖插入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

回答

1

正如Aravind所說,400錯誤通常意味着您的數據有問題。從this鏈接,實體批交易將失敗,如果一個或多個下列條件不滿足:

  • 所有受操作作爲交易的一部分實體必須具有相同的PartitionKey值
  • 一個實體在交易中只能出現一次,並且只能對其執行一個操作。
  • 交易可以包括至多100個實體,其總有效載荷可能不超過4MB的大小
  • 所有實體都受到Understanding the Table Service Data Model中所述的限制。

請檢查您的實體對這四條規則,並確保您沒有違反規則之一。

+0

對於此批處理操作,我使用總計5行至少4000行的Azure表。因此數據有效載荷大於4MB。有什麼方法可以使用超過4MB的有效載荷和超過100個實體進行單個事務? – Sunil

+0

不,你不能。這些是硬性限制,你不能覆蓋它們。您需要將實體批次拆分爲更小的批次,以便您不違反上述規則並單獨嘗試這些批次。 HTH。 –

+0

有沒有什麼方法可以找到批量數據有效載荷大小?所以我將能夠確保每個批處理請求有效負載大小必須<4MB。 – Sunil