Лучший способ реализовать набор запросов на обновление в виде пакетов с использованием executebatch() в цикле

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

Мои вопросы

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

Примечание. Число обновляемых записей может достигать 9000 записей (9000 идентификаторов), а для переменной 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 );
    }
}

1 ответ

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

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

Другие вопросы по тегам