Batch-операции

Базовый Java
≈ 1 мин чтения

Когда одинаковых команд много

Если нужно обновить сотни строк, можно выполнить сотни отдельных JDBC-вызовов. Но часто выгоднее собрать несколько команд в batch и передать их драйверу одной группой. Это уменьшает количество отдельных взаимодействий между приложением и базой и может заметно ускорить массовые операции.

Batch с PreparedStatement

String sql = "INSERT INTO tags(name) VALUES (?)";

try (PreparedStatement statement = connection.prepareStatement(sql)) {
    for (String tag : tags) {
        statement.setString(1, tag);
        statement.addBatch();
    }

    int[] counts = statement.executeBatch();
    System.out.println(counts.length);
}

Каждый вызов addBatch() добавляет текущий набор параметров в очередь объекта. executeBatch() отправляет накопленные команды на выполнение и возвращает массив результатов обновления для элементов batch.

Batch не заменяет транзакцию

Групповая отправка команд и атомарность — разные задачи. Если серия изменений должна примениться целиком или не примениться вообще, batch обычно выполняют внутри явно управляемой транзакции.

Не собирай бесконечный batch. Для очень больших объёмов данные обычно отправляют порциями: так проще контролировать память, размер запроса и время одной операции.