Вызов последовательности Oracle nextval кажется нерегулярным. Наше бизнес-ограничение (уникальный токен) - генерировать уникальный номер, поэтому мы используем последовательность оракулов. Мы используем hibernate весеннее загрузочное приложение. Но в этом случае мы вызываем nextval по собственному запросу (JDBC), поэтому управление спящим режимом не выполняется. Но после некоторого времени запуска приложения в рабочей среде из уникального токена возникает исключение уникального ограничения, так как последовательность оракула пытается сгенерировать тот же порядковый номер или не увеличивает значение последовательности через некоторое время.
Во всех наших уникальных токенах разность значений последовательности равна 1 или 2. Но когда значение последовательности не увеличивается (при следующем значении), ручное увеличение последовательности на 2494 (кэш 1000 ORDER). Нашей последовательностью является ORDER, но она застряла в некоторых значениях, необходимо увеличить на 2494, чтобы сохранить нашу уникальность
Наше определение последовательности выглядит следующим образом:
CREATE SEQUENCE SEQ_98090 INCREMENT BY 1 CACHE 1000 ORDER NOCYLE NOPARTITION;
Чтобы решить эту проблему, мы вручную увеличиваем значение последовательности, чтобы наше уникальное бизнес-ограничение (уникальный токен) не получало никакого уникального исключения из ограничения.
Наше приложение работает на нескольких серверах.
Мы отлаживаем значение последовательности извне, видим, что значение последовательности оракула не увеличивается.
CREATE SEQUENCE SEQ_98090 INCREMENT BY 1 CACHE 1000 ORDER NOCYLE NOPARTITION;
String queryString = "SELECT " + dbSequence + ".NEXTVAL FROM DUAL";
Query query = em.createNativeQuery(queryString);
BigDecimal issuedTokenBin = null;
try {
issuedTokenBin = (BigDecimal) query.getSingleResult();
} catch (Exception ex) {
log.error("Error :", ex);
}
Поскольку мы получаем последовательность из последовательности oracle, она всегда должна возвращать увеличенное значение.
Из картинки: последовательность Oracle застряла в первой выбранной строке (приложение получило уникальное нарушение ограничения). Затем мы вручную увеличиваем его, и приложение запускается. последние 8 цифр уникального токена, то есть 79140 и 81634, происходят из последовательности оракула.