3.9.16. Генерация последовательностей

Данный механизм позволяет генерировать уникальные последовательности чисел через единый API, независимо от используемой СУБД.

Основной частью данного механизма является бин UniqueNumbers с интерфейсом UniqueNumbersAPI, доступный в блоке Middleware. Методы интерфейса:

  • getNextNumber() - получить следующее значение последовательности. Механизм позволяет вести одновременно несколько последовательностей, идентифицируемых простыми строками. Имя последовательности, из которой нужно получить значение, передается в параметре domain.

    Последовательности не требуют предварительной инициализации - при первом вызове getNextNumber() соответствующая последовательность будет создана и вернет значение 1.

  • getCurrentNumber() - получить текущее, то есть последнее сгенерированное, значение последовательности. Параметр domain - имя последовательности.

  • setCurrentNumber() - установить текущее значение последовательности. Следующий вызов getNextNumber() вернет значение, увеличенное на 1.

Пример получения следующего значения последовательности в бине блока Middleware:

@Inject
private UniqueNumbersAPI uniqueNumbers;

private long getNextValue() {
  return uniqueNumbers.getNextNumber("mySequence");
}

Для получения значений последовательностей в клиентских блоках используется метод getNextNumber() сервиса UniqueNumbersService.

Для управления последовательностями можно использовать JMX-бин app-core.cuba:type=UniqueNumbers с методами, дублирующими методы UniqueNumbersAPI.

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

  • Для HSQL, PostgreSQL, Microsoft SQL Server 2012+ и Oracle каждой последовательности UniqueNumbersAPI соответствует последовательность (sequence) SEC_UN_{domain} в базе данных.

  • Для Microsoft SQL Server версии ниже 2012 каждой последовательности соответствует таблица SEC_UN_{domain} с первичным ключом типа IDENTITY.

  • Для MySQL последовательности соответствуют строкам в таблице SYS_SEQUENCE.