2016-06-16 7 views
0

В следующем методе я пытаюсь запустить запрос обновления в виде пакетов. Но этот метод зависает время от времени, когда он запускается. Мое предположение заключается в том, что по какой-то причине он создает блокировку таблицы БД на sample_table, а затем, когда executebatch запускается снова, он ожидает, что блокировка будет выпущена. В конечном итоге процесс зависает.Лучший способ реализовать набор запросов обновления в виде пакетов с использованием executebatch() в цикле

Мои вопросы

  1. ли это лучший способ осуществить запрос на обновление для пакета выполнения?
  2. Должен ли я не устанавливать autocommit в false и затем фиксировать после каждого ps.executeBatch() в цикле.
  3. Это эффективнее, добавив все партии, а затем совершая или совершая каждую партию снова и снова.

Примечание: Количество записей обновленными может доходить до 9000 записей (9000 ID) и BATCHSIZE переменная установлена ​​в 1000

private void updateMethod(List<Long> idList) 
{ 
    int batchSizeCount = 0; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    Connection con = criteriaWrapper.getConnection(); 
    StringBuilder sb = new StringBuilder("UPDATE sample_table SET column_name1 = 1 , column_name2 = SYSTIMESTAMP WHERE sample_table.table_id = ? "); 

    try 
    { 
     con.setAutoCommit(false); 
     ps = con.prepareStatement(sb.toString()); 

     for(Long table_id : idList) 
     { 
      int count = 0; 
      ps.setLong(++count, table_id); 
      ps.addBatch(); 
      if (++batchSizeCount % batchSize == 0) 
      { 
       ps.executeBatch(); 
       functionProvider.logger(); //Prints previously appended logs 
      } 
     } 
     ps.executeBatch(); 
     con.commit(); 
     con.setAutoCommit(true); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     DBUtility.close(rs); 
     DBUtility.close(ps); 
    } 
} 

ответ

0

Если вы можете использовать пружину, она имеет легкий вариант :

jdbcTemplate.batchUpdate (query, insertParameters). Я проверил миллионы транзакций и занимает всего несколько секунд.

+0

К сожалению, использование пружины для меня не является вариантом. – direndd

+0

Весенняя партия делает то же самое, что и вы. Он способен обрабатывать гораздо больше, чем 9k в одной партии. Вы можете легко выполнить в одной партии. Вам может потребоваться отслеживать возвращаемое значение выполнения, чтобы увидеть, сколько было успешным, чтобы решить, хотите ли вы выполнить фиксацию или нет. – krmanish007

 Смежные вопросы

  • Нет связанных вопросов^_^