我需要创建一个唯一的循环序列,该序列是两个单独序列的串联。
顺序1的范围是-1001至1040
序列2的范围是-220到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序列。但是由于来自不同系统的多个并行调用,这可能会丢失一些序列号。
有一个更好的方法吗?
最佳答案
首先,您的两个序列可以简单地映射到简单的整数序列,即:
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中的序列是无间隙的。唯一。要创建无缝序列生成器,您必须引入序列化,例如锁,以确保在任何时候只有一个会话可以获取下一个值。