副问题[/!--empirenews.page--]
在实现分库分表的环境下,数据库自增主键已无法担保自增主键的全局独一。为此,MyCat 提供了全局sequence,而且提供了包括当地设置和数据库设置等多种实现方法。下面临这几种实现方法做一下先容。
1. 当地文件方法
道理:
此方法 MyCAT 将 sequence 设置到文件中,当行使到 sequence 中的设置后,MyCAT 会更下classpath 中的 sequence_conf.properties 文件中 sequence 当前的值。
设置方法:
在 sequence_conf.properties 文件中做如下设置:
- GLOBAL_SEQGLOBAL_SEQ.HISIDS=
- GLOBAL_SEQ.MINID=1001
- GLOBAL_SEQ.MAXID=1000000000
- GLOBAL_SEQ.CURID=1000
个中 HISIDS 暗示行使过的汗青分段(一样平常无非凡必要可不设置),MINID 暗示最小 ID 值,MAXID 暗示最大ID 值,CURID 暗示当前 ID 值。
server.xml 中设置:
- <system><property name="sequnceHandlerType">0</property></system>
注:sequnceHandlerType 必要设置为 0,暗示行使当地文件方法。
行使示例:
- insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);
弱点:当 MyCAT 从头宣布后,设置文件中的 sequence 会规复到初始值。
利益:当地加载,读取速率较快。
2. 数据库方法
道理:
在数据库中成立一张表,存放 sequence 名称(name),sequence 当前值(current_value),步长(incrementint 范例每次读取几多个 sequence,假设为 K)等信息;
Sequence 获取步调:
当首次行使该 sequence 时,按照传入的 sequence 名称,从数据库这张表中读取 current_value,和increment 到 MyCat 中,并将数据库中的 current_value 配置为原 current_value 值+increment 值。
MyCat 将读取到 current_value+increment 作为本次要行使的 sequence 值,下次行使时,自动加 1,当行使 increment 次后,执行步调 1)沟通的操纵。
MyCat 认真维护这张表,用到哪些 sequence,只必要在这张表中插入一笔记录即可。若某次读取的sequence 没有效完,体系就停掉了,则这次读取的 sequence 剩余值不会再行使。
设置方法(server.xml 设置):
- <system><property name="sequnceHandlerType">1</property></system>
注:sequnceHandlerType 必要设置为 1,暗示行使数据库方法天生 sequence。
设置方法(数据库 设置):
1) 创 建 MYCAT_SEQUENCE 表
- – 建设存放 sequence 的表
- DROP TABLE IF EXISTS MYCAT_SEQUENCE;
- – name sequence 名 称
- – current_value 当 前 value
- – increment 增添步长! 可领略为 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;
- – 插入一条 sequence
- INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (‘GLOBAL’, 100000,100);
2) 建设相干 function
- – 获取当前 sequence 的值 (返回当前值,增量)
- DROP FUNCTION IF EXISTS mycat_seq_currval;
- DELIMITER
- CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf-8
- 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 utf-8
- 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 utf-8
- DETERMINISTIC
- BEGIN
- UPDATE MYCAT_SEQUENCE
- SET current_valuecurrent_value = current_value + increment WHERE name = seq_name;
- RETURN mycat_seq_currval(seq_name);
- END
- DELIMITER;
3)sequence_db_conf.properties 相干设置,指定 sequence 相干设置在哪个节点上:
譬喻:
- USER_SEQ=test_dn1
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|