2013-10-07 2 views
1

У меня есть процесс, который загружает данные из файла, а затем пытается вставить записи в таблицу.Ошибка блокировки объекта в БД с использованием хранимой процедуры

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

В то же время другой процесс запускается и пытается считывать данные на основе некоторого условия из таблицы XYZ, поскольку 1-й процесс еще не завершил запись данных в таблицу, а 2-й процесс пытается прочитайте одни и те же данные, я получаю ошибку использования объекта.

Я думал о двух вариантов, чтобы устранить эту проблему:

  1. Если все записи не вставляются Process1, сохранить один из столбца состояния разные, так что Process2 не может извлечь записи

  2. Вставьте данные в куски, если что-то не получается, у вас есть механизм для повторного запуска с последней вставленной записи (для этого нужен механизм).

Я использую DB2 и простой jdbc для вставки записей.

Пожалуйста, дайте мне знать, Что самый лучший способ пойти об этой проблемы

+0

Другой вариант - делать все вставки в одной транзакции, иначе другие не будут видеть вставки до завершения процесса загрузки. Btw: какую СУБД вы используете? Postgres? Oracle? –

+0

Я использую DB2, и я использую простой jdbc для вставки записей в DB – Abs

ответ

0

Вы не говорите, что DB или библиотеки, которые вы используете, но вы должны смотреть на использование транзакций, чтобы контролировать одновременное чтение и запись. Процесс 1 должен написать кусок данных в одной транзакции. Ни одна из этих данных не будет видна для процесса 2 до тех пор, пока все не будет написано, поэтому вы не должны создавать конфликты между ними. Это предполагает, что у вас установлен правильный уровень изоляции транзакций.

Если вы используете Spring, например, легко пометить функцию с помощью @Transactional, чтобы все вызовы DB в tat-функции работали в одной транзакции.

+0

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

+0

@ Abs: Вы говорите, что большое количество вставок приводит к блокировке таблицы в DB2?Это довольно хромает. Какая версия DB2 это? Я думал, что в новых версиях читатели никогда не будут заблокированы писателями. –

+0

Я использую Db2 iseries v4.5. – Abs

1

V4.5 - это антиквариат, но даже в этом случае большинство обычных операций с БД не требуют исключительной блокировки файла. Я очень удивлен, услышав, что здесь есть блокировка объектов.

Я предлагаю немного изменить сторону IBM. Продолжайте использовать JDBC для загрузки строк в таблицу DB2, как это происходит сейчас, но когда полная загрузка выполняется, загрузите одну строку в новую таблицу. Эта строка в новой таблице - это то, что вызовет процесс IBM для обработки полностью загруженной исходной таблицы. Администратор IBM может использовать триггер в новой таблице, чтобы получить уведомление о появлении новой записи.

Если невозможно изменить сторону IBM, попробуйте загрузить временную таблицу, а затем с помощью JT400 выдать команду CPYF, чтобы IBM OS копировала строки в реальную таблицу. Это должно работать намного быстрее, чем по сети. Или переименуйте его из TEMPFILE в REALFILE, но процесс IBM может не понравиться.

+0

Я написал пример программы, чтобы доказать, что операторы БД приобретают исключительную блокировку файла. Мне не удалось изменить сторону IBM. Я подумывал ввести еще один столбец в таблице и заполнить некоторым значением «N» и обновить это значение до Y, как только все строки будут вставлены в таблицу. Другой процесс будет выбирать только строки с данными в новом столбце как «Y». Он должен работать таким образом. Что вы думаете об этом подходе? – Abs

+0

У нас может быть проблема с терминологией. В OS/400 исключительная блокировка означает, что никакой другой процесс в системе не может даже смотреть на вашу таблицу. Вы можете узнать, какой замок вы используете с помощью команды OS400 WRKOBJLCK. Если вы не можете изменить сторону IBM, как вам будет разрешено добавлять столбец? –

+0

Простите меня за недоразумение. Да, я могу изменить таблицу, если потребуется. – Abs

Смежные вопросы