例子接上文:http://www.itdecent.cn/p/adba8875d1c9


如上,mycat已經(jīng)配置好了。
在實(shí)現(xiàn)分庫(kù)分表的情況下,數(shù)據(jù)庫(kù)自增主鍵已無(wú)法保證自增主鍵的全局唯一。為此,MyCat 提供了全局
sequence,并且提供了包含本地配置和數(shù)據(jù)庫(kù)配置等多種實(shí)現(xiàn)方式。
數(shù)據(jù)庫(kù)配置
在db1的真實(shí)數(shù)據(jù)庫(kù)中,創(chuàng)建一個(gè)表:
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);
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_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 ;
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 ;
測(cè)試一下:


測(cè)試方法是否添加成功,如圖,測(cè)試成功。
設(shè)定CUSTOMER表的增長(zhǎng)方式
CUSTOMER要大寫
insert into MYCAT_SEQUENCE (name,current_value,increment) values ('CUSTOMER',0,1);
-
配置schema.xml
5.png
如圖,
customer表:主鍵是ID,autoIncrement="true"表示這個(gè)表的主鍵是自增長(zhǎng)的,是邏輯表的主鍵自增長(zhǎng),dataNode是分片節(jié)點(diǎn),rule是分片規(guī)則。
mycat_sequence表:主鍵是name,dataNode是在其中一個(gè)分片節(jié)點(diǎn)下。
-
配置rule.xml
6.png 配置server.xml

如圖,sequncehandlerType設(shè)為1;
0 表示是表示使用本地文件方式
1 表示的是根據(jù)數(shù)據(jù)庫(kù)來(lái)生成,就是我們自己配置的自增長(zhǎng)
2 表示時(shí)間戳的方式
-
配置自增長(zhǎng)主鍵
在下圖的位置中的sequence_db_conf.properties文件中添加CUSTOMER=dn1,指定在哪個(gè)分片。
5.png
-
測(cè)試
8.png


可以看出,插入的數(shù)據(jù)均勻分配到不同的分片,并且保證了主鍵id的唯一。

再看mycat_sequence表,因?yàn)閯倓偛迦肓?條數(shù)據(jù),所以現(xiàn)在的current_value字段的值為6。



