Проблема пакетного обновления JDBC - PullRequest
8 голосов
/ 29 мая 2009

У меня есть немного уникальное требование к API Java-JDBC вместе с Oracle Database. У меня autoCommit по умолчанию, что верно для Oracle, и я использую пример, подобный этой ссылка .

Однако, когда я добавляю, скажем, 1000 пакетов, и скажем, что каждая из них является вставкой. И давайте предположим, что около 20 записей нарушили некоторые ограничения, я хочу, чтобы оставшиеся 980 перешли в COMMITTED (и впредь были видимы для любых других запросов, использующих любое другое соединение) в базу данных и проигнорировали 20 записей. В приведенном выше примере, когда одна строка нарушает какую-либо транзакцию, тогда , даже когда я фиксирую в блоке catch, транзакция фиксируется только до первого сбоя .

Я знаю, что пакетные обновления должны выполняться ТОЛЬКО тогда, когда вы уверены, что все строки пройдут, а обработка исключений не одна, но я планирую ПАТЧИРОВАТЬ существующую базу данных, так что какие-то "плохие практики" в порядке :) Любой примеры кода будут высоко оценены.

**** БОЛЬШЕ ДЕТАЛЕЙ ****

Использовать Простую вставку / обновление нехорошо, так как я обрабатываю около 3M строк, поэтому я собираю каждую 1000 записей. Простое добавление 1000 вставок в цикле (без учета исключений) занимает намного больше времени (около 5 секунд для каждых 1000 записей), в отличие от пакетного обновления <300 мс. </p>

Проблема: С базой данных Oracle драйвер, по-видимому, останавливается при первом сбое, то есть, когда 1000 строк упакованы, а 100-я вышла из строя, я хочу, чтобы он продолжался до 1000-й строки. Я думаю, что это не может быть сделано в JDBC (с Oracle) Как ссылка указывает, что только несколько баз данных поддерживают такую ​​функцию, и, вероятно, Oracle не один

Ответы [ 7 ]

3 голосов
/ 29 мая 2009

Вы можете использовать хранимую процедуру PL / SQL, используя предложение SAVE EXCEPTIONS, которое позволит вам выполнить массовое обновление, а затем вернуть те строки, которые не могли быть обновлены. Вот несколько примеров ссылок:

http://rwijk.blogspot.com/2007/11/save-exceptions.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8912264456901

2 голосов
/ 29 мая 2009

Вы должны вставить в рабочую таблицу, которая не имеет ограничений, затем удалить или исправить то, что было бы нарушением, и ВСТАВИТЬ ВЫБРАТЬ остальное в реальную таблицу одним оператором SQL.

1 голос
/ 08 июня 2012

Не могли бы вы попробовать оператор Oracle слияния при несовпадении? Пример: http://www.idevelopment.info/data/Oracle/DBA_tips/SQL/SQL_14.shtml

1 голос
/ 01 июня 2009

Я искал какое-то решение в строке «С базой данных Oracle драйвер, по-видимому, останавливается на первом сбое, то есть, когда 1000 строк упакованы, а 100-й сбой, я хочу, чтобы он продолжался до 1000-й строки». По сути, я хотел знать, можно ли это сделать с помощью драйвера JDBC Oracle.

Однако были предложены различные ответы (большинство из которых я уже рассмотрел) 1) Отключение ограничений / загрузка данных / удаление некорректных строк / повторение этого много раз 2) Сделайте всю проверку перед загрузкой данных 3) Уменьшите размер партии до 50 - 100.

К сожалению, моя проверка не может быть выполнена перед загрузкой, а размер пакета составляет 50 или 100, что означает, что для выполнения 5-метровых строк требуется больше времени (на самом деле, общее время увеличилось до нескольких часов вместо 40 минут с размером пакета, равным 1000). Я прибег к сохранению размера пакета 1000 ПРИНИМАЯ к проблеме, как и помещаю код в цикл while и выполняю работу, пока мы не заполним все строки.

Как я уже сказал, поскольку НЕТ ПУТИ С ORACLE BATCH JDBC для продолжения после первого сбоя, ответ на этот вопрос будет "НЕ УДАЛЕН" и просто примите ограничения и задокументируйте тот факт, что это инструмент занимает около 40 минут:)

1 голос
/ 29 мая 2009

Сначала я должен проверить, не нарушено ли ограничение, а затем вставить эту запись, если ограничения не нарушены.

1 голос
/ 29 мая 2009

Вы можете попробовать это: Начните с партий по 50 или 100. (Выберите размер, чтобы они имели хорошую вероятность для успешной обработки). Те, которые терпят неудачу, обрабатывают один за другим.

Другая возможность: отключить ограничения, загрузить данные, удалить те строки, которые нарушают ограничения.

0 голосов
/ 20 февраля 2013

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

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