2016-07-31 5 views
2

Я получаю ниже ошибки при попытке вставить несколько объектов в хранилище Таблица Azure:Azure Batch Insert: Bad Request Error

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 boot и Azure-хранилище Java SDK версии 4.3.0.

+2

Обычно ошибка 400 означает, что что-то не так со значением одного из ваших свойств. Один из способов узнать - проследить запрос/ответ через Fiddler и увидеть фактические данные, отправляемые. Возможно, существует некоторая несогласованность типов данных. – Aravind

+0

e.RequestInformation.HttpStatusMessage предоставит вам точную причину сбоя. – yonisha

+0

@ Aravind. Я думаю, что данные верны, потому что я могу вставить те же данные, установив batchSize = 10. – Sunil

ответ

1

Как упоминал Араувинд, ошибка 400 обычно означает, что у вас что-то не так. С this связи, партия сделка предприятие потерпит неудачу, если один или несколько из следующих условий не выполняется:

  • Все объекты, подлежащие операции в рамках сделки должны иметь одинаковое значение PartitionKey.
  • Сущность может появляться только один раз в транзакции, и только одна операция может быть выполнена против нее.
  • Сделка может включать не более 100 единиц, а ее общая полезная нагрузка может быть не более 4 МБ в размере.
  • Все объекты подчиняются ограничениям, описанным в Understanding the Table Service Data Model.

Пожалуйста, проверьте свои сущности в отношении этих четырех правил и убедитесь, что вы не нарушаете одно из правил.

+0

Для этой пакетной операции я использую всего 5 таблиц Azure с не менее 4000 строк. Следовательно, полезная нагрузка данных составляет более 4 МБ. Есть ли способ, которым я могу использовать полезную нагрузку более 4 МБ и более 100 объектов для одной транзакции? – Sunil

+0

Нет, вы не можете. Это жесткие ограничения, и вы не можете их переопределить. Вам нужно будет разделить пакет сущности на меньшие партии, чтобы вы не нарушали упомянутые выше правила и попробуйте эти партии отдельно. НТН. –

+0

Есть ли способ найти размер полезной нагрузки для пакетных данных? Поэтому я смогу удостовериться, что для каждого пакета данных размер полезной нагрузки должен быть <4 МБ. – Sunil