TDDL 在分布式下的SEQUENCE原理

TDDL大家应该很熟悉了,淘宝分布式数据层。很好的为我们实现了分库分表、Master/Salve、动态数据源配置等功能。

那么分布式之后,数据库自增序列肯定用不了了,如何方便快捷的解决这个问题呢?TDDL也提供了SEQUENCE的解决方案。

总述

在数据库中创建 sequence 表,用于记录,当前已被占用的id最大值。

每台客户端主机取一个id区间(比如 1000~2000)缓存在本地,并更新 sequence 表中的id最大值记录。

客户端主机之间取不同的id区间,用完再取,使用乐观锁机制控制并发。

第一步:创建一张sequence对应的表

CREATE TABLE `imp_sequence` (
  `BIZ_NAME` varchar(45) NOT NULL COMMENT '业务名称',
  `CURRENT_VALUE` int(11) NOT NULL COMMENT '当前最大值',
  `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建时间',
  `GMT_MODIFIED` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`BIZ_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据序列表';

表名和字段可以按各自规则定义,定义之后需要与第二步DAO中的定义相对应!

TDDL生成全局ID原理

几张逻辑表需要声明几个sequence。

第二步:配置sequenceDao

<bean >
        <!-- 数据源 -->
        <property name="dataSource"  ref="dataSource" />
        <!-- 步长-->
        <property name="step" value="1000" />
        <!-- 重试次数-->
        <property name="retryTimes" value="1" />
        <!-- sequence 表名-->
        <property name="tableName" value="gt_sequence" />
        <!-- sequence 名称-->
        <property name="nameColumnName" value="BIZ_NAME" />
        <!-- sequence 当前值-->
        <property name="valueColumnName" value="CURRENT_VALUE" />
        <!-- sequence 更新时间-->
        <property name="gmtModifiedColumnName" value="gmt_modified" />
</bean>
View Code

相关文章:

  • 2021-09-23
  • 2022-02-19
  • 2021-06-07
  • 2021-08-21
  • 2021-08-19
  • 2021-12-21
  • 2021-12-07
  • 2021-06-11
猜你喜欢
  • 2021-06-08
  • 2022-12-23
  • 2022-12-23
  • 2022-01-20
  • 2021-09-02
  • 2021-07-01
  • 2021-05-07
相关资源
相似解决方案