我需要创建一个独特的循环序列,它是两个单独序列的串联。
序列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数据库序列。但由于来自不同系统的多个并行呼叫,这可能会遗漏一些序列号。
有更好的方法吗?
答案 0 :(得分:2)
首先,你的两个序列可以简单地映射到一个简单的整数序列,即:
1 -> 1001-220
2 -> 1001-221
etc.
要计算给定任何整数值的两个值,请使用以下公式:
n -> TRUNC(1001+n/22) || '-' || (MOD(n-1,21)+220)
e.g。
26 -> TRUNC(1001+26/22) || '-' || (MOD(26-1,21)+220) -> 1002-224
其次,Oracle中的序列永远不能保证无间隙;唯一的。要制作无间隙序列生成器,必须引入序列化,例如锁定,以确保任何时候只有一个会话可以获得下一个值。