2016-07-31 18 views
2

Azureのテーブルストレージに複数のエンティティを挿入しようとしたときに、私は、エラーの下に取得しています: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(); 
       } 
    } 

} 

バッチサイズの値を10に割り当てるとコードが正常に動作していますが、1000または100に割り当てるとバッドリクエストエラーがスローされます。

このエラーを解決するのを手伝ってください。私はSpringブートとAzureストレージJava SDKバージョン4.3.0を使用しています。

+2

一般に、400エラーは、プロパティの1つの値に問題があることを意味します。調べる1つの方法は、Fiddlerを介してリクエスト/レスポンスをトレースし、送信されている実際のデータを確認することです。データ型の不一致がある可能性があります。 – Aravind

+0

e.RequestInformation.HttpStatusMessageはエラーの正確な理由を提供します – yonisha

+0

@Aravind私はbatchSize = 10を設定して同じデータを挿入できるため、データが正しいと思います。 – Sunil

答えて

1

Aravindが述べたように、400エラーは通常、データに問題があることを意味します。 thisリンクからは、エンティティのバッチトランザクションは、以下の条件の1つ以上が満たされない場合に失敗します:

  • 取引の一環として、事業の対象となるすべてのエンティティが同じのPartitionKey値を持っている必要があります。
  • エンティティはトランザクションに一度しか表示されず、1回の操作しか実行できません。
  • トランザクションがせいぜい100のエンティティを含むことができ、その総ペイロードサイズにこれ以上4以下MBであってもよいです。
  • すべてのエンティティはUnderstanding the Table Service Data Modelに記載されている制限の対象です。

エンティティをこれらの4つのルールと照合して、いずれかのルールに違反していないことを確認してください。

+0

このバッチ処理では、少なくとも4000行の合計5つのAzureテーブルを使用しています。したがって、データペイロードは4MB以上です。 1つのトランザクションに4MB以上のペイロードと100以上のエンティティを使用できる方法はありますか? – Sunil

+0

できません。これらは厳しい限界であり、あなたはそれらを無効にすることはできません。上記の規則に違反せず、別々にバッチを試すように、エンティティバッチをより小さなバッチに分割する必要があります。 HTH。 –

+0

バッチデータのペイロードサイズがわかる方法はありますか?だから私は、すべてのバッチリクエストのペイロードサイズが<4MBでなければならないことを確認することができます。 – Sunil

関連する問題