3.9.16. 序列生成
该机制可以通过单个 API 生成唯一的数字序列,并且与 DBMS 类型无关。
这个机制的主要部分是实现了 UniqueNumbersAPI
接口的 UniqueNumbers
bean。这个 bean 对象可以在中间件block中找到。这个接口具有以下方法:
getNextNumber(String domain)
– 获取序列的下一个值。该机制能够同时管理由任意字符串标识的多个序列。需要获取值的序列的名称通过domain
参数传递。序列不需要初始化。当第一次调用
getNextNumber()
方法时,将创建相应的序列并返回 1。getCurrentNumber(String domain)
– 获得当前值,也就是序列生成的最后一个值。domain
参数设置序列名称。setCurrentNumber(String domain)
– 设置序列的当前值。下一次调用getNextNumber()
方法时将返回这个值递增 1 之后的值。
下面是在一个中间件 bean 对象中获取序列中的下一个值的示例:
@Inject
private UniqueNumbersAPI uniqueNumbers;
private long getNextValue() {
return uniqueNumbers.getNextNumber("mySequence");
}
服务 的 getNextNumber()
方法用于在客户端 block 中获取序列值。
与 UniqueNumbersAPI
拥有相同方法的 app-core.cuba:type=UniqueNumbers
JMX bean用于管理序列。
序列生成机制的实现取决于 DBMS 类型。序列参数也可以直接在数据库中管理,但方式不同。
对于 HSQL、 Microsoft SQL Server 2012+ 、 PostgreSQL 和 Oracle,每个
UniqueNumbersAPI
序列对应于数据库中名称为SEC_UN_{domain}
格式的数据库原生序列。对于 2012 之前的 Microsoft SQL Server,每个序列对应一个带有 IDENTITY 类型主键的
SEC_UN_{domain}
表。对于 MySQL,序列对应于
SYS_SEQUENCE
表中的记录。