Проблема дублирования службы bpel в кластерной среде

У меня есть процесс bpel, который вызывает хранимую процедуру db2 через java для получения уникального порядкового номера, а затем вставляет этот номер в одну из таблиц db2. Этот процесс выполняется в кластерной среде, поэтому иногда бывает так, что два экземпляра процесса получают один и тот же уникальный порядковый номер, а затем пытаются вставить повторяющиеся значения в таблицу, что приводит к ошибке. Спасибо.


person Sonali    schedule 10.02.2014    source источник
comment
Очевидно, хранимая процедура, которая должна генерировать уникальные порядковые номера, этого не делает. Вам нужно будет переписать эту процедуру или, если это невозможно, можно синхронизировать вызовы к ней в вашей Java-программе, чтобы два процесса не могли вызывать процедуру одновременно.   -  person mustaccio    schedule 10.02.2014
comment
Другой вариант — использовать встроенный sequence введите DB2, что гарантирует отсутствие дубликатов.   -  person bhamby    schedule 10.02.2014
comment
Спасибо за информацию. Хранимая процедура использует тип последовательности в DB2. Кроме того, из-за кластерной среды выполнение вызовов синхронизации через Java не будет разрешено, поскольку у нас есть два сервера, на которых находится код, и вызовы Java к последовательности db2 будут выполняться с обоих из них одновременно, что приводит к дублированию.   -  person Sonali    schedule 11.02.2014


Ответы (2)


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

При этом ничто не мешает вам вставить в таблицу строку со значением, которое последовательность еще не сгенерировала; Затем, когда последовательность возвращает рассматриваемое значение, и вы пытаетесь вставить его, это не удастся:

create table test (id int not null primary key);
create sequence s1 start with 10;

-- This will insert the value 10, which is OK.
insert into test values (nextval for s1);

-- This will insert the value 11, which is OK.
insert into test values (nextval for s1);

-- Insert a row without using sequence  (BAD!)
insert into test values (13);

-- This will insert the value 12, which is OK.
insert into test values (nextval for s1);

-- This will attempt to the value 13, which will fail because it is a "duplicate", 
-- but not because the sequence generated a duplicate.
insert into test values (nextval for s1); 

Решение этой проблемы заключается в следующем:

  1. Убедитесь, что процессы не вставляют значения без использования последовательности
  2. Если № 1 невозможен, убедитесь, что вы используете alter sequence для перезапуска последовательности, чтобы не вызвать конфликт. (в приведенном выше примере alter sequence s1 restart with 14 после выполнения непослушного оператора вставки.
person Ian Bjorhovde    schedule 11.02.2014

Как вы сказали, Bpel работает в кластерной среде.

Если вы используете опрос Bpel, убедитесь, что вы отметили флаг «Распределенный опрос».

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

person Wanderley    schedule 19.06.2015