Ответ
Batch update (пакетное обновление) — это техника выполнения нескольких SQL-запросов (INSERT, UPDATE, DELETE) за один сетевой вызов к СУБД, вместо отправки каждого запроса по отдельности.
Основная цель — значительное повышение производительности за счет:
- Сокращения сетевых издержек: Объединение множества запросов в один пакет уменьшает количество циклов обмена данными между приложением и БД.
- Снижения накладных расходов СУБД: Сервер базы данных обрабатывает пакет как единую рабочую единицу, что часто эффективнее.
Как использовать в JDBC:
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name, email) VALUES (?, ?)");
ps.setString(1, "Alice");
ps.setString(2, "alice@example.com");
ps.addBatch(); // Добавляем первый набор параметров в пакет
ps.setString(1, "Bob");
ps.setString(2, "bob@example.com");
ps.addBatch(); // Добавляем второй набор
int[] updateCounts = ps.executeBatch(); // Отправляем весь пакет
conn.commit();
Важные замечания:
- Не все СУБД и драйверы одинаково хорошо поддерживают пакетную обработку.
- Размер пакета следует подбирать эмпирически (часто оптимально 50-100 запросов), чтобы не превысить лимиты буфера драйвера или СУБД.
- При ошибке в одном из запросов пакета поведение зависит от драйвера и СУБД (может откатить весь пакет или часть).
Ответ 18+ 🔞
А, слушай-ка, про эту вашу пакетную обработку! Ну, это ж просто магия, чтобы не дрочить базу каждым чихом по отдельности.
Вот представь: твоё приложение — это такой занудный заказчик, а база данных — это я, уставший админ. Если ты будешь прибегать ко мне каждые пять секунд с криками «вставь запись!», «а теперь обнови вот эту!», я тебе к третьему разу ебальник разобью клавиатурой. А если ты придёшь с одним здоровенным списком дел на листочке — ну, окей, ща гляну, сделаю всё разом. Вот этот листочек — он и есть batch update, пакетное обновление.
Зачем это, спросишь? Да чтобы не тратить время, блядь, на ерунду!
- Сеть не грузи. Вместо тысячи мелких писем — один здоровенный файл. Экономия на конвертах и марках, ёпта.
- Базу не дергай. Серверу тоже проще один раз тяжело вздохнуть и обработать кучу команд, чем сто раз по чуть-чуть.
Как этим пользоваться в JDBC? Да элементарно, Ватсон!
Смотри, вот тебе священный код, не трогай его, он и так хорош:
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name, email) VALUES (?, ?)");
ps.setString(1, "Alice");
ps.setString(2, "alice@example.com");
ps.addBatch(); // Запомнил первую Алису
ps.setString(1, "Bob");
ps.setString(2, "bob@example.com");
ps.addBatch(); // Запомнил Боба-лобоба
int[] updateCounts = ps.executeBatch(); // А теперь ВЖУХ! И всех разом в базу!
conn.commit();
Но, сука, есть нюансы, как говорится:
- Не все базы это любят. Где-то работает как часы, а где-то — хуй с горы. Надо проверять.
- Размер пакета — это вам не хуй собачий. Нельзя запихнуть миллион запросов, а то драйвер лопнет. Обычно золотая середина — 50-100 штук. Поэкспериментируй.
- Если в пакете один запрос кривой и сломался — это пиздец, вопрос на миллион. Иногда откатывается всё, иногда часть работы остаётся. Тут уж как повезёт, нужно смотреть документацию и тестировать, как твоя СУБД себя ведёт. Волнение ебать!
Короче, если нужно много чего записать — пакуй в батч и не мучай ни себя, ни базу. Эффективность, блядь, зашкаливает!