2016-07-31 10 views
2

ich unten Störung erhalte beim Versuch, mehrere Objekte in Azure Table Storage einzufügen:Azure Batch Insert: Bad Request Fehler

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) 

Unten ist die Java-Code für die Batch-Insert:

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(); 
       } 
    } 

} 

Above Code funktioniert gut, wenn ich BatchSize-Wert 10 zuweisen, aber wenn ich 1000 oder 100 zuweisen wird, wird Bad Request Fehler werfen.

Bitte helfen Sie mir, diesen Fehler zu beheben. Ich benutze Spring Boot und Azure-Speicher Java SDK Version 4.3.0.

+2

Im Allgemeinen bedeutet 400 Fehler, dass etwas mit dem Wert einer Ihrer Eigenschaften nicht stimmt. Eine Möglichkeit, dies herauszufinden, besteht darin, die Anfrage/Antwort über Fiddler zu verfolgen und die tatsächlich gesendeten Daten zu sehen. Es ist möglich, dass einige Datentypen nicht übereinstimmen. – Aravind

+0

e.RequestInformation.HttpStatusMessage liefert Ihnen den genauen Grund für den Fehler – yonisha

+0

@Aravind Ich denke, Daten sind korrekt, da ich dieselben Daten durch Setzen von BatchSize = 10 einfügen kann. – Sunil

Antwort

1

Wie Aravind erwähnt, bedeutet 400 Fehler in der Regel, dass etwas mit Ihren Daten nicht stimmt. Von this Link, wird ein Unternehmen Batch-Transaktion fehlschlagen, wenn eine oder mehrere der folgenden Bedingungen nicht erfüllt sind:

  • Alle Einheiten als Teil der Transaktion Operationen unterliegen den gleichen PartitionKey Wert haben muss.
  • Eine Entität kann nur einmal in der Transaktion erscheinen und nur eine Operation kann dagegen ausgeführt werden.
  • Die Transaktion kann höchstens 100 Einheiten enthalten und ihre Gesamtnutzlast darf nicht mehr als 4 MB in Größe betragen.
  • Alle Entitäten unterliegen den in Understanding the Table Service Data Model beschriebenen Einschränkungen.

Überprüfen Sie Ihre Entitäten anhand dieser vier Regeln und stellen Sie sicher, dass Sie keine der Regeln verletzen.

+0

Für diesen Stapelvorgang verwende ich insgesamt 5 Azure-Tabellen mit mindestens 4000 Zeilen. Daher beträgt die Datennutzlast mehr als 4 MB. Gibt es eine Möglichkeit, Payload mehr als 4 MB und mehr als 100 Entitäten für eine einzelne Transaktion zu verwenden? – Sunil

+0

Nein, du kannst nicht. Dies sind die harten Grenzen und Sie können sie nicht überschreiben. Sie müssten den Entitätsstapel in kleinere Stapel aufteilen, damit Sie nicht gegen die oben genannten Regeln verstoßen und diese Stapel separat versuchen. HTH. –

+0

Gibt es eine Möglichkeit, die Chargendaten Nutzlast Größe zu finden? So kann ich sicherstellen, dass die Payload-Größe für jede Stapelanforderung <4 MB sein muss. – Sunil