3.10.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
.