Странная генерация последовательности DB2 JPA - PullRequest
1 голос
/ 15 февраля 2011

Я обнаружил последовательности в своем проекте JPA с использованием eclipselink, Spring и DB не генерировались непрерывно.JPA, похоже, извлекает следующие кэшированные порядковые номера, даже если текущие порядковые номера не запускаются.

моя последовательность создана этим оператором

create or replace sequence MYSCHEMA.SEQ_MY_ID
as integer
  start with 1 increment by 1;

и кэш последовательности равен 20.

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

RUN #1
1
2
RUN #2
3
4

Но на самом деле сгенерированные порядковые номера выглядят так:

RUN #1
1
21
RUN #2
2
3
RUN #3
22
41

В данный момент одновременно выполняется два потока для запроса последовательности.Но последовательность должна генерироваться непрерывно, даже в многопоточной среде.Почему используется следующее кэшированное значение?Как я могу понять, кто виноват?DB2, JPA или Spring.

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

В общем, я бы порекомендовал использовать increment и allocSize, чтобы позволить заранее выделять идентификаторы. Это резко улучшит производительность. Не знаю, почему вы не хотите дыр, но если это реальное требование, вам нужно будет удалить опцию кэширования в дополнение к вашему приращению.

1 голос
/ 16 февраля 2011

Используйте опцию NO CACHE при создании вашей последовательности, и в ней не будет пробелов.Имейте в виду, что производительность будет немного хуже.

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

Последовательности DB2 имеют опцию «ORDER / NO ORDER», а по умолчанию «NO ORDER». Я думаю, что это причина, но у меня нет времени, чтобы проверить это. Выложу его после тестирования.

...