Пакетная вставка и запрос jdbc по сравнению с одиночными вставками с сгенерированным ключом

Я хочу вставить много строк в таблицу, которая автоматически генерирует ключи. JDBC не гарантирует, что получение сгенерированных ключей будет работать при пакетном обновлении.

It is implementation-defined as to whether getGeneratedKeys will return generated values after invoking the executeBatch method. (Спецификация JDBC 4.0 2006 г., стр. 135).

У меня есть два варианта. Вставьте каждую строку отдельно и получите ключ. Или выполните пакетную вставку, а затем запросите ключи.

Чтобы избежать повторного запроса нескольких ключей, я мог бы использовать этот подход здесь . Имея, например. 5 готовых заявлений с разными размерами. А затем разбить мой «пакетный запрос» на наименьший возможный оператор.

Какой метод быстрее?


person Franz Kafka    schedule 14.06.2011    source источник


Ответы (1)


Это зависит.

У меня нет цифр, действительно ли executeBatch() быстрее, чем многократное использование PreparedStatement, поэтому мое предложение таково:

  1. Попробуйте, работает ли getGeneratedKeys() для вашего драйвера JDBC. Если это не работает, пакетные вставки в любом случае не будут работать для вас.

  2. Напишите тестовый пример для обоих и измерьте производительность. Это дает вам реальные данные, на которых можно основывать свое решение. Все остальное - просто догадки (и неправильные в 90% случаев).

[EDIT] Если вы хотите, чтобы ваше приложение не зависело от БД, добавьте тест в свое приложение и запустите его на временной/тестовой таблице. Если тест прошел успешно, выберите реализацию, использующую пакетные обновления, в противном случае вернитесь к грубой силе.

person Aaron Digulla    schedule 14.06.2011
comment
О, я хотя getGeneratedKeys() обязателен для водителя, но это не так. Я хочу, чтобы база данных приложения была независимой, если это возможно. - person Franz Kafka; 14.06.2011