Mycat获取全局序列号 - 极悦
Mycat教程
Mycat读写分离
Mycat分库分表
Mycat全局序列号

Mycat获取全局序列号

本地文件方式

● 在servler.xml文件中配置sequnceHandlerType=0;

● 在conf/sequence_conf.properties中维护主键信息;

● 如果想要每个表生成的主键连续,可以在sequence_conf.properties配置当前表的生成值,一般将Global替换为自己对应的前缀即可(三个地方)。

取值的时候通过next value for MYCATSEQ_XXXX获取。

时间戳方式

sequnceHandlerType=2

这种方式,需要将主键设置为varchar类型,长度一般20;

数据库方式

这里是数据库方式生成主键ID,不是采用数据库的主键自增,而是mycat利用mysql数据库生成一个主键。

1、在数据库中创建一张表,三个函数

DROP TABLE IF EXISTS MYCAT_SEQUENCE;

CREATE TABLE MYCAT_SEQUENCE (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 1,
PRIMARY KEY(name)) ENGINE=InnoDB default charset=utf8;

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ("GLOBAL", 0, 100);

DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER //
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval;
END //
DELIMITER  ;


DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER //
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END //
DELIMITER ;

DROP FUNCTION IF EXISTS mycat_seq_nextval;
DELIMITER //
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END //
DELIMITER ;

2、server.xml配置

<property name="sequnceHandlerType">1</property>

注:sequnceHandlerType 需要配置为1,表示使用数据库方式生成sequence

3、sequence_db_conf.properties配置

指定sequence相关配置在哪个节点上,例如我们如果在p2p-admin上创建的生成主键的表,那么根据我们在schema.xml文件中的配置,对应的节点应该是dn2,所以在sequence_db_conf.properties中配置的GLOBAL应该就是dn2

GLOBAL=dn2

4、插入时怎么用

insert into tb1(id,name) values(next value for MYCATSEQ_GLOBAL,"test");

总结

本课程偏向于资深开发人员、架构师;

一般中小公司不会采用到该技术,因为中小公司的数据量没有达到一定的级别,在数据量比较大的时候才会采用该技术

可以在简历中体现:本人爱好互联网各类开发技术,乐于技术研究,利用工作之余研究过Mycat分库分表、xxx源码、xxx等技术

全部教程