jdbcTemplate.batchUpdate () с меньшим списком, чем getBatchSize (), выдает ошибку IndexOutOfBoundsException - PullRequest
0 голосов
/ 27 февраля 2020

Я звоню jdbcTemplate.batchUpdate() с кусками 1000. Список может быть сколь угодно большим - и иногда он может быть меньше 1000, и в этом случае есть только одна маленькая партия. Я предположил, что jdbcTemplate.batchUpdate будет достаточно умен, чтобы выяснить, сколько пакетов нужно выполнить.

Но я вижу следующее: предположим, в моем списке 3 элемента:

final List<UsersT> batchInsertUsers = ...; // 3 items in List

String sqlInsert = "INSERT INTO USERS_T ...";

jdbcTemplate.batchUpdate(sqlInsert, new BatchPreparedStatementSetter() {

    @Override
    public int getBatchSize() {
        return 1000; // Max Batch size greater than current list. 1 batch expected
    }

    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        ps.setInt(1, batchInsertUsers.get(i).getId()); 
        ps.setString(2, batchInsertUsers.get(i).getPassword()); 
        // etc.
    }

}

Ошибка:

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at app.ResearcherServiceImpl$1.setValues(ResearcherServiceImpl.java:535)

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

int getBatchSize() Возвращает размер партии.

Используйте эту реализацию:

@Override
public int getBatchSize() {
    return batchInsertUsers.size(); // Return the size of the batch.
}
0 голосов
/ 27 февраля 2020

Проблема не в jdbcTemplate. Из ошибки видно, что размер списка равен 3, и вы пытаетесь использовать элемент со значением индекса 3. В идеале ваш код должен go до значения i, равного 2. В общем, ваш код должен устанавливать значения до количества элементов, которыми вы являетесь. сохранение, а не размер партии.

...