Этот вопрос проверяет умение эффективно вставлять большие объёмы данных в базу данных через JDBC, что критично для производительности при массовых операциях.
Batch insert — это техника оптимизации, при которой несколько операций INSERT объединяются в один пакет и отправляются на сервер базы данных за один сетевой вызов. Это резко сокращает задержки, связанные с коммуникацией между приложением и СУБД, и особенно полезно при импорте данных, миграциях или обработке больших наборов записей.
Основной механизм реализуется через интерфейс Statement (чаще PreparedStatement). Вместо цикла с вызовом executeUpdate() для каждой строки, вы последовательно вызываете addBatch(), накапливая запросы в памяти. Затем одним вызовом executeBatch() все запросы отправляются на сервер. Метод возвращает массив целых чисел, где каждый элемент — это количество обновлённых строк для соответствующего запроса в batch.
Рассмотрим код вставки списка пользователей:
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
conn.setAutoCommit(false); // Отключаем auto-commit для скорости
for (User user : userList) {
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getEmail());
pstmt.addBatch(); // Добавляем запрос в batch
// Периодически выполняем batch, чтобы не переполнять память
if (i % 1000 == 0) {
pstmt.executeBatch();
conn.commit();
}
}
// Выполняем оставшиеся запросы
pstmt.executeBatch();
conn.commit(); // Фиксируем всю транзакцию
} catch (SQLException e) {
conn.rollback(); // В случае ошибки откатываем
throw e;
}executeBatch().COPY в PostgreSQL или LOAD DATA в MySQL.Вывод: Batch insert через JDBC стоит применять всегда, когда нужно вставить более десятка записей — это стандартный способ радикально повысить производительность массовых вставок в Java-приложениях, работающих с реляционными базами данных.