Вставить в несколько таблиц с JDBC - PullRequest
3 голосов
/ 02 марта 2011

Я пытаюсь использовать JDBC для вставки в несколько таблиц. Поскольку это должно быть быстро, я хочу использовать PreparedStatement и метод executeBatch. Таблицы объединяются отношением внешнего ключа.

  • Первой идеей было использование getGeneratedKeys(), но это не работает с некоторыми драйверами JDBC. Например. PostgreSQL.

  • Второй идеей было использование функции SQL-currval (...). Но необходимость вызова execute batch для одного оператора и для другого делает все ключи одинаковыми. Таким образом, этот метод также не работает.

  • JDBC не принимает вставки, разделенные точкой с запятой.

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Вы, кажется, в основном используете PostgreSQL. Полезно знать, что, поскольку версия драйвера JDBC PostgreSQL 8.4-701 , PreparedStatement#getGeneratedKeys() полностью функциональна.

Вам нужно только подготовить оператор следующим образом, чтобы он мог вернуть ключи:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

Итак, при необходимости обновите свой драйвер и исправьте способ подготовки заявления. Кстати, это относится и ко многим другим драйверам JDBC.


Совершенно другая альтернатива - полностью отказаться от простого JDBC, подняться на один уровень абстракции и погрузиться в «хороший» ол Hibernate или современный JPA. Они предлагают чисто объектно-ориентированный подход к обработке сущностей базы данных в Java без необходимости возиться с сгенерированными ключами и т.п. Все это прозрачно обрабатывается под крышками, и они поддерживают очень широкий спектр диалектов БД.

0 голосов
/ 02 марта 2011

Хорошо, вот мой собственный ответ.

До тех пор, пока поставщики не смогут правильно реализовать нужную вам функцию getGeneratedKeys () и резервный вариант для конкретной базы данных.

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

Вот мой обходной путь для Postgres 9.0:

  • Сначала создайте большое количество ключей с "SELECT nextval('public.\"table_column_seq\"') FROM generate_series(1,"+pollsize+")");
  • Затем раздайте эти ключи во всех ваших подготовленных пакетных операторах.

Потратил на это целый кровавый день, а потом все, что я получил, - это уродливое решение. JDBC должен при запуске приложения проверить, действительно ли драйвер оправдывает свои ожидания, и в противном случае выдать какое-нибудь неисправимое злое YouVeGotaF ** ckedUpDriverException.

0 голосов
/ 02 марта 2011

Если код должен выполняться быстро, вам следует попробовать написать хранимую процедуру / функцию, которая будет принимать массивы значений, которые будут вставлены в таблицы.

Вот пример .

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