Java / SQL创建自定义序列/基于两个序列创建序列

时间:2015-02-16 06:05:12

标签: java oracle

我需要创建一个独特的循环序列,它是两个单独序列的串联。

序列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数据库序列。但由于来自不同系统的多个并行呼叫,这可能会遗漏一些序列号。

有更好的方法吗?

1 个答案:

答案 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中的序列永远不能保证无间隙;唯一的。要制作无间隙序列生成器,必须引入序列化,例如锁定,以确保任何时候只有一个会话可以获得下一个值。