Skip to content

9 全局序列

9.1 基于本地时间戳的算法

​ 这种方式下,全局序列在LIBRA服务实例本地产生,只能生成全局唯一的ID,不能实现连续自增。 使用这种方式需要对应字段为bigint来保证64位。整数的位模式如下:

a.30bitsb.5bitsc.5bitsd.12bitse.12bits
为系统当前时间戳的低42位中的高30位。5位datacenter id。5位 worker id。12位自增长值为系统当前时间戳的低42位中的低12位。

其中,a ­ e为从高位到低位。

注意事项:

  • data center id和workerid的最大值均为31。
  • 每毫秒时间内允许的最多序列值为4095。为了保证序列值的唯一性,在毫秒时间内请求超过4095个序列值时系统会进行等待到下一毫秒开始。因为java没有无符号整数,实际使用42位时间戳相对1288834974657L(2010年左右)的偏移量。42位时间戳可供使用139年.

1、时间戳方式由sequence_time_conf.properties文件进行配置。具体配置如下:

properties
#this is comment
WORKID=01
DATAACENTERID=01

每个配置项的含义为:

  • WORKID:指定worker id值, 必须为[0,31]之间的整数。

  • DATAACENTERID:指定datacenter id值, 必须为[0,31]之间的整数。

  • 注意事项:

    WORKID,DATAACENTERID的配置必须使该LIBRA实例在LIBRA集群中唯一。

2、schema.xml中配置序列

配置文件中在schema级别下通过squence标签申明要使用的时间戳序列timer,申明时间戳序列后,可在table定义中使用序列

xml
<schema name="TestDb1" dbType="oracle">
     <table name="mb_acct_balance_test" dataNode="dn1,dn2" primaryKey="internal_key" rule="mod" suquenceName="time"></table>
    <sequence name="time" squenceHandlerType="timer"></sequence>
</schema>

9.2 基于数据库表的offset算法

​ 基于数据库表实现的序列,该方式利用了数据库的并发和并发更新互斥的特性。 在数据库中建立一张表,保存序列的当前值和步长,使用该序列时,系统从表中读取序列的当前值,加上步长,返回给客户端的同时更新表中的当前值

线程获取序列的执行步骤如下:

  1. 检查是否有请求序列未用的缓存的序列值,如果没有,执行步骤2;否则,执行步骤4。

  2. 到相应的数据节点上执行SELECTcurrent_val,cache_size from LIBRA_sequence where sequenceName=seqName;其中, seqName为请求序列的序列名。此步骤获取的序列值数依赖于该序列的缓存cacheSize,为区间[current_value,current_value+cacheSize)中的值。

  3. 缓存步骤2得到的序列值。

  4. 返回缓存的序列值中第一个未用的序列值。

1、schema.xml中配置序列

配置文件中在schema级别下通过squence标签声明要使用的数据库表序列oracleSequence,声明数据库表序列后,可在table定义中使用序列

xml
<schema name="TestDb1" dbType="oracle">
     <table name="mb_acct_balance_test" dataNode="dn1,dn2" primaryKey="internal_key" rule="mod" suquenceName="tableSequence"></table>
    <sequence name=" tableSequence " squenceHandlerType=" tableSequence "></sequence>
</schema>

9.3 基于数据库序列对象的序列

​ 1、序列是oacle提供的用于产生一系列唯一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主码值。一个序列的值是由特别的Oracle程序自动生成,因而序列避免了在运用层实现序列而引起的性能瓶颈。Oracle序列允许同时生成多个序列号,而每一个序列号是唯一的。 当一个序列号生成时,序列是递增,独立于事务的提交或回滚。容许设计缺省序列,不需指定任何子句。该序列为上升序列,默认由1开始,增量为1,没有上限。

  • 创建序列
sql
CREATE SEQUENCE 序列名
[INCREMENT  BY  n]
[START  WITH  x]
[MAXVALUE|MAINVALUE|NOMAXVALUE]
[{CYCLE|NOCYCLE}]
[{CACHE n | NOCACHE}]
  • 更改序列
sql
ALTER SEQUENCE
[user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE ]
  • 删除序列
sql
DROP  SEQUENCE [user.]sequence_name;

2、schema.xml中配置序列

配置文件中在schema级别下通过squence标签声明要使用的数据库序列oracleSequence,声明数据库序列后,可在table定义中使用序列

xml
<schema name="TestDb1" dbType="oracle">
     <table name="mb_acct_balance_test" dataNode="dn1,dn2" primaryKey="internal_key" rule="mod" suquenceName="oracleSequence"></table>
    <sequence name="oracleSequence" squenceHandlerType="oracleSequence"></sequence>
</schema>