Использование getGeneratedKeys с пакетными вставками в MySQL с Connector / J - PullRequest
16 голосов
/ 10 февраля 2011

Используя Connector / J, я хотел бы сделать пакетную вставку в основную таблицу, а затем пакетную вставку в таблицу сведений (PreparedStatement.executeBatch() для обеих). Я не нашел много информации в Интернете, поэтому я ищу отзывы от людей, которые имеют опыт работы с этим.

  1. Могу ли я использовать Statement.getGeneratedKeys() чтобы получить идентификаторы вновь вставленных строк в мастер-таблице, чтобы я мог использовать их в качестве внешних ключей в детализация вставок?

  2. Что, если не каждый запрос привел к вставка (например, был запрос insert ignore или insert ... on duplicate key update)? Я получу скандал в Statement.getGeneratedKeys() за каждый оператор или только для новых?

  3. Что будет Statement.getGeneratedKeys() возврат есть ошибка с одним из вставлены основные записи и continueBatchOnError установлен на true в строке подключения?

  4. Есть ли какие-либо различия в связанном поведении между версиями Connector / J 5.0.x против 5.5.x? А как насчет MySQL 5.0 против 5.1?

  5. Есть ли какие-либо другие проблемы или ошибки, о которых мне следует знать?

  6. Есть ли лучший способ сделать это?

1 Ответ

18 голосов
/ 11 февраля 2011

Ну, я провел несколько тестов.С Connector / J 5.1 и MySQL 5.1.42 я наблюдаю следующее:

  1. Statement.getGeneratedKeys() работает как положено для вставок

  2. Еслистрока была вставлена ​​или обновлена ​​(массив счетчиков обновлений, возвращаемый executeBatch(), возвращает «1» или «2»), Statement.getGeneratedKeys() будет иметь ключ для этой строки.Если строка не была изменена (insert ignore или insert ... on duplicate key update, что приводит к неработоспособности, executeBatch() возвращает 3), ключ отсутствует.

  3. ResultSetвозвращаемое getGeneratedKeys будет иметь записи для успешно вставленных строк, согласно (2).Не будет сгенерированной строки ключей для неудачных вставок (где значение счетчика обновлений Statement.EXECUTE_FAILED)

  4. ?

  5. Будьте осторожны сrewriteBatchedStatements в строке подключения JDBC.Если он установлен на true, любые сбои приведут к тому, что каждая строка в переписанном «чанке» будет обрабатываться так, как если бы она была неудачной.Один из способов справиться с этим - выполнить итерацию сбойных строк и повторить их без пакетной обработки.

  6. ?

...