爱程序网

Mycat探索之旅(3)----Mycat的全局序列号

来源: 阅读:

一、本地文件方式

原理:此方式MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下classpath中的sequence_conf.properties文件中

sequence当前的值。

配置方式:

  • sequence_conf.properties中配置:

在sequence_conf.properties文件中做如下配置:

#default global sequence

GLOBAL.HISIDS=

#最小值

GLOBAL.MINID=10001

#最大值

GLOBAL.MAXID=20000

#当前值

GLOBAL.CURID=10000

  • server.xml中配置:
<!--sequnceHandlerType=0表示:使用本地文件的方式配置mycat的全局序列号,对应sequence_conf.properties文件sequnceHandlerType=1表示:使用数据库表的方式配置mycat的全局序列号--><property name="sequnceHandlerType">0</property>
  • 配置完成后重启mycat服务

测试:

clip_image001

二、使用数据库方式

原理:在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读

取多少个sequence,假设为K)等信息;

Sequence获取步骤:

1).当初次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,和increment到MyCat中,

并将数据库中的current_value设置为原current_value值+increment值;

2).MyCat将读取到current_value+increment作为本次要使用的sequence值,下次使用时,自动加1,当使用increment次

后,执行步骤1)相同的操作.

MyCat负责维护这张表,用到哪些sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence没有用完,系统就

停掉了,则这次读取的sequence剩余值不会再使用。

配置方式:

server.xml配置:

<!--sequnceHandlerType=0表示:使用本地文件的方式配置mycat的全局序列号,对应sequence_conf.properties文件sequnceHandlerType=1表示:使用数据库表的方式配置mycat的全局序列号--><property name="sequnceHandlerType">1</property>

数据库配置:

1) 创建MYCAT_SEQUENCE表

– 创建存放sequence的表

DROP TABLE IF EXISTS MYCAT_SEQUENCE;

– name sequence名称

– current_value 当前value

– increment 增长步长! 可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.

/*创建存放sequence的表*/CREATE TABLE MYCAT_SEQUENCE (    NAME VARCHAR (50),    current_value INT NOT NULL,    increment INT NOT NULL DEFAULT 100,    PRIMARY KEY (NAME)) ENGINE = INNODB;

 

clip_image002

– 插入一条sequence

INSERT INTO MYCAT_SEQUENCE (    NAME,    current_value,    increment)VALUES    ('GLOBAL', 100000, 100);

clip_image003

2) 创建相关function

– 获取当前sequence的值 (返回当前值,增量)

-- ------------------------------ 函数结构: `mycat_seq_currval`-- 获取当前sequence的值(返回当前值,增量)-- ----------------------------DROP FUNCTIONIF EXISTS mycat_seq_currval;CREATE  FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1    DETERMINISTICBEGIN    DECLARE retval VARCHAR(64);    SET retval="-1,0";    SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval         FROM MYCAT_SEQUENCE  WHERE name = seq_name;    RETURN retval ;END

 

clip_image004

– 设置sequence值

-- ------------------------------ 函数结构: `mycat_seq_setval`-- 设置sequence的值-- ----------------------------DROP FUNCTION IF EXISTS mycat_seq_setval;CREATE  FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64)     CHARSET latin1    DETERMINISTICBEGIN    DECLARE retval VARCHAR(64);    DECLARE inc INT;    SET inc = 0;    SELECT increment INTO inc FROM MYCAT_SEQUENCE WHERE name = seq_name;    UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name;    SELECT concat(CAST(value as CHAR),",",CAST(inc as CHAR)) INTO retval;    RETURN retval;END

 

clip_image005

– 获取下一个sequence值

-- ------------------------------ 函数结构: `mycat_seq_nextval`-- 获取下一个sequence的值-- ----------------------------DROP FUNCTION IF EXISTS mycat_seq_nextval;CREATE  FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1    DETERMINISTICBEGIN    DECLARE retval VARCHAR(64);    DECLARE val BIGINT;    DECLARE inc INT;    DECLARE seq_lock INT;    set val = -1;    set inc = 0;    SET seq_lock = -1;    SELECT GET_LOCK(seq_name, 15) into seq_lock;    if seq_lock = 1 then      SELECT current_value + increment, increment INTO val, inc           FROM MYCAT_SEQUENCE WHERE name = seq_name for update;      if val != -1 then          UPDATE MYCAT_SEQUENCE SET current_value = val WHERE name = seq_name;      end if;      SELECT RELEASE_LOCK(seq_name) into seq_lock;    end if;    SELECT concat(CAST((val - inc + 1) as CHAR),",",CAST(inc as CHAR)) INTO retval;    RETURN retval;END

 

clip_image006

3) sequence_db_conf.properties相关配置,指定sequence相关配置在哪个节点上:

clip_image007

这里设置的是dn1节点,那么上面的函数及表都是建立在dn1节点对应的数据库实例上的

注意:MYCAT_SEQUENCE表和以上的3个function,需要放在同一个节点上。function请直接在具体节点的数据库上执行

测试:

insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'hexmith');

clip_image008

insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'Mycat');

clip_image009

在前面的测试中,我添加到MYCAT_SEQUENCE表中的数据设置的步长是100,此处吻合。

相关文章列表:
关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助