2015-02-16 3 views
0

У меня есть требование создать уникальную циклическую последовательность, которая является конкатенацией двух отдельных последовательностей.Java/SQL Создание пользовательской последовательности/создание последовательности на основе двух последовательностей

Последовательность 1 диапазон from- от 1001 до +1040 Последовательность 2 диапазон составляет от 220 до from- 240

логика для генерации последовательности первая последовательность приращения 2, сохраняя последовательность 1, как есть. После того, как последовательность 2 достигает 240, необходимо увеличивать последовательность 1.

Последовательность будет что-то, как показано ниже: -

1001-220 1001-221 1001-222 .... .... 1001-240 1002-220 1002-221 1002-222 .... .... .... .... 1040-240 1001-220

Это довольно просто, если есть только один процесс/JVM, которому требуется эта последовательность, и в этом случае я могу просто иметь две статические переменные и реализовать эту логику.

Но последовательности могут использоваться несколькими процессами, сидящими на разных JVM и, следовательно, должны быть потокобезопасными.

Следующая мысль, которую я имел, заключалась в использовании последовательностей Oracle DB для обоих. Но это может пропустить некоторые порядковые номера из-за множества параллельных вызовов, поступающих из разных систем.

Есть ли лучший способ сделать это?

+0

Требуется ли, чтобы порядковые номера никогда не пропускались? Сохраняете ли вы эти значения в базе данных? –

+0

Да, номера последовательностей не могут быть пропущены. У меня нет требования хранить значения в БД, а просто возвращать последовательности как часть ответа веб-службы. – HarshaKA

ответ

2

Во-первых, ваши две последовательности тривиальным отображаемыми в простой последовательности целых чисел, то есть:

1 -> 1001-220 
2 -> 1001-221 
etc. 

Для вычисления двух значений, указанных любое целое значение, используйте следующие формулы:

n -> TRUNC(1001+n/22) || '-' || (MOD(n-1,21)+220) 

например

26 -> TRUNC(1001+26/22) || '-' || (MOD(26-1,21)+220) -> 1002-224 

Во-вторых, последовательности в Oracle никогда не могут быть беспроблемными; только уникальный. Чтобы создать генератор беззеркальной последовательности, вы должны ввести сериализацию, например. блокировку, чтобы гарантировать, что только один сеанс может получить следующее значение в любой момент времени.

+0

Это чистое решение, о чем я думал, но понятия не имел, как его реализовать. Для генерации значения n я буду использовать последовательность Oracle с NOCACHE, чтобы свести к минимуму риск пробелов. Как вы сказали, это не гарантирует «беспроблемность», но потерять несколько цифр по сравнению с работой с замками - это лучше (по крайней мере, в моем случае). Спасибо @ Джеффри – HarshaKA