Пакетная обработка MySQL с помощью Statement.RETURN_GENERATED_KEYS - PullRequest
1 голос
/ 16 ноября 2011

Я пытаюсь выполнить 2 SQL-заявления в пакете.первый оператор - это вставка, которая использует автоматически сгенерированное значение для своего идентификатора.второй оператор - вставка в другую таблицу, но он должен использовать автоматически сгенерированное значение сверху как часть значения вставки

что-то вроде (где id - просто показать автоматически сгенерированное поле, которое не определено в sql

stmt.addbatch(insert into table1("id_auto_generated", "foo"));
stmt.addbatch(insert into table2("table1_id", "boo"));

способ, которым я делаю это сейчас, заключается в использовании этого во втором sql

insert into table2(LAST_INSERT_ID(), "boo");

Проблема в том, что он медленный, даже в пакетных операторах, очень медленный, так как мой пакет может содержать 50 000 вставок.

Я хотел переключиться на подготовленные операторы, но не знаю, как использовать Statement.RETURN_GENERATED_KEYS или LAST_INSERT_ID () с подготовленными операторами.

1 Ответ

2 голосов
/ 17 ноября 2011

Я не уверен, что это способ, которым вы можете сделать это с addBatch, за исключением того, как вы используете.Еще одна попытка - это отказаться от метода addBatch() и вместо этого попробовать отключить автоматическую фиксацию.Тогда вы можете использовать stmt.getGeneratedKeys();.Что-то вроде:

connection.setAutoCommit(false);
stmt.executeUpdate("insert into table1(\"id_auto_generated\", \"foo\") ...");
DatabaseResults results = stmt.getGeneratedKeys();
// extract the id from the results
stmt.executeUpdate("insert into table2(\"table1_id\", \"boo\") ...");
... many more stmts here
connection.commit();
connection.setAutoCommit(true);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...