本地文件方式
● 在servler.xml文件中配置sequnceHandlerType=0;
● 在conf/sequence_conf.properties中維護(hù)主鍵信息;
● 如果想要每個表生成的主鍵連續(xù),可以在sequence_conf.properties配置當(dāng)前表的生成值,一般將Global替換為自己對應(yīng)的前綴即可(三個地方)。
取值的時候通過next value for MYCATSEQ_XXXX獲取。
sequnceHandlerType=2
這種方式,需要將主鍵設(shè)置為varchar類型,長度一般20;
這里是數(shù)據(jù)庫方式生成主鍵ID,不是采用數(shù)據(jù)庫的主鍵自增,而是mycat利用mysql數(shù)據(jù)庫生成一個主鍵。
1、在數(shù)據(jù)庫中創(chuàng)建一張表,三個函數(shù)
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,表示使用數(shù)據(jù)庫方式生成sequence
3、sequence_db_conf.properties配置
指定sequence相關(guān)配置在哪個節(jié)點(diǎn)上,例如我們?nèi)绻趐2p-admin上創(chuàng)建的生成主鍵的表,那么根據(jù)我們在schema.xml文件中的配置,對應(yīng)的節(jié)點(diǎn)應(yīng)該是dn2,所以在sequence_db_conf.properties中配置的GLOBAL應(yīng)該就是dn2
GLOBAL=dn2
4、插入時怎么用
insert into tb1(id,name) values(next value for MYCATSEQ_GLOBAL,"test");
總結(jié)
本課程偏向于資深開發(fā)人員、架構(gòu)師;
一般中小公司不會采用到該技術(shù),因?yàn)橹行」镜臄?shù)據(jù)量沒有達(dá)到一定的級別,在數(shù)據(jù)量比較大的時候才會采用該技術(shù)
可以在簡歷中體現(xiàn):本人愛好互聯(lián)網(wǎng)各類開發(fā)技術(shù),樂于技術(shù)研究,利用工作之余研究過Mycat分庫分表、xxx源碼、xxx等技術(shù)