本次实验 MyCat Scheme.xml 文件以下
sql
本次实验将 MyCat 全局序列号配置在 dn3 节点上面
数据库
修改 server.xml配置:函数
<system><property name="sequnceHandlerType">1</property></system>测试
注:sequnceHandlerType 须要配置为1,表示使用数据库方式生成sequence.spa
修改 sequence_db_conf.properties 配置:code
配置文件中 GLOBAL=dn3 (GLOBAL 为全局序列的名称,dn3 表示节点)server
执行如下 SQL 建立全局 sequence 须要的表,并初始化数据(在 dn3 节点上)xml
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 100, primary key(name)) engine=innodb; insert into mycat_sequence(name, current_value, increment) values (' GLOBAL', 100000, 100); -- 注意这里的 GLOBAL 要大写,对应上 sequence_db_conf.properties 的配置
建立如下函数 (在 dn3 节点上)rem
-- 获取当前sequence的值 (返回当前值,增量) 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 ;
-- 设置sequence值 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 ;
-- 获取下一个sequence值 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 ;
测试 sequenceinnodb
-- 测试 sequence insert into t_person(id, name) values(next value for MYCATSEQ_GLOBAL, 'test');
更详细的内容请参考 MyCat 权威指南