Последовательность Oracle не увеличивается после следующего - PullRequest
0 голосов
/ 08 июля 2019

Вызов последовательности 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, она всегда должна возвращать увеличенное значение.

From TID value 3009053444 to next TID 3009091522, last part of unique token i.e. oracle sequence stuck. Unless we manually increase it

Из картинки: последовательность Oracle застряла в первой выбранной строке (приложение получило уникальное нарушение ограничения). Затем мы вручную увеличиваем его, и приложение запускается. последние 8 цифр уникального токена, то есть 79140 и 81634, происходят из последовательности оракула.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Общее преимущество кэширования последовательностей заключается в скорости: чем выше значение кэширования, тем меньше раз Oracle должен обращаться к базе данных и получать кэш последовательностей. Негативный эффект кэширования заключается в том, что после того, как существует кэш последовательностей, и при перезагрузке базы данных Oracle отменяет все значения, которые были в кеше.

Поэтому, если вы не хотите оставлять пробелы в значениях вашей последовательности, вы должны заплатить цену, установив для вашей последовательности значение NOCACHE.

0 голосов
/ 08 июля 2019

Вам действительно нужно кэширование в вашей последовательности.Как насчет использования следующего:

CREATE SEQUENCE SEQ_TEST INCREMENT BY 1 NOCACHE ORDER NOCYCLE;

С уважением, Akash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...