2013-04-27 1 views
-1

Используя JDBC (Oracle), мне нужно вставить тысячи строк в три разные таблицы. В принципе, я хочу выполнить три вставки SQL-оператора один за другим в цикле.Spring JDBC - Массовая вставка, ориентированная на несколько таблиц

Я прочитал this link, и я хотел бы знать, какая реализация лучше (с точки зрения времени выполнения):

  1. Execute первый оператор SQL в пакете и извлекаемых сгенерированные ключи
  2. Выполнить второй заявление SQL, используя сгенерированные ключи от стадии 1 в пакете и получить новые сгенерированные ключи
  3. Exercute третьего оператора SQL с использованием как сгенерированные ключи от стадии 1 и 2

Или зацикливание каждой записи для вставки и для каждой записи, выполняющей три оператора SQL один за другим.

Я знаю, что первая реализация зависит от базы данных (поскольку ResultSet.getGeneratedKeys() не поддерживается каждой базой данных). Может быть, есть третье воплощение, о котором я не думал?

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

Кроме того, мне интересно, могу ли я использовать любую абстракцию Spring JDBC. Вторая реализация представляется возможной с помощью Spring JdbcTemplace (обертывание метода с помощью @Transactional для использования того же соединения), но первое выглядит сложным, поскольку метод batchUpdate из JdbcTemplate не возвращает сгенерированные ключи.

ответ

1

Если время выполнения не является проблемой, я бы пошел вторым путем. Это менее подвержено ошибкам и легче читать другой коллега. Кроме того, у вас больше контроля над транзакциями. Например, вы можете выполнить фиксацию после того, как будут выполнены 3 вставки.

Для первого способа: обойти GeneratedKeys проблем, вы можете сделать SELECT после первого набора INSERTs и получить получить идентификаторы (GeneratedKeys), то сделать второй комплект вставок с извлеченными идентификаторами и так далее ... Думаю, это грязно.

также рассмотрите используя хранимая процедура