一、本地文件方式 原理:此方式MyCAT將sequence配置到文件中,當使用到sequence中的配置後,MyCAT會更下classpath中的sequence_conf.properties文件中 sequence當前的值。 配置方式: sequence_conf.properties中配置:
一、本地文件方式
原理:此方式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服務
測試:
二、使用資料庫方式
原理:在資料庫中建立一張表,存放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;
– 插入一條sequence
INSERT INTO MYCAT_SEQUENCE ( NAME, current_value, increment ) VALUES ('GLOBAL', 100000, 100);
2) 創建相關function
– 獲取當前sequence的值 (返回當前值,增量)
-- ---------------------------- -- 函數結構: `mycat_seq_currval` -- 獲取當前sequence的值(返回當前值,增量) -- ---------------------------- DROP FUNCTION IF EXISTS mycat_seq_currval; CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN 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
– 設置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 DETERMINISTIC BEGIN 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
– 獲取下一個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 DETERMINISTIC BEGIN 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
3) sequence_db_conf.properties相關配置,指定sequence相關配置在哪個節點上:
這裡設置的是dn1節點,那麼上面的函數及表都是建立在dn1節點對應的資料庫實例上的
註意:MYCAT_SEQUENCE表和以上的3個function,需要放在同一個節點上。function請直接在具體節點的資料庫上執行
測試:
insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'hexmith');
insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'Mycat');
在前面的測試中,我添加到MYCAT_SEQUENCE表中的數據設置的步長是100,此處吻合。