美文网首页
mycat自增长主键配置

mycat自增长主键配置

作者: GongZH丶 | 来源:发表于2018-12-13 10:43 被阅读61次

    例子接上文:https://www.jianshu.com/p/adba8875d1c9

    1.png 2.png

    如上,mycat已经配置好了。

    在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局
    sequence,并且提供了包含本地配置和数据库配置等多种实现方式。

    数据库配置

    在db1的真实数据库中,创建一个表:

    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 ;
    

    测试一下:


    3.png 4.png

    测试方法是否添加成功,如图,测试成功。
    设定CUSTOMER表的增长方式
    CUSTOMER要大写

    insert into MYCAT_SEQUENCE (name,current_value,increment) values ('CUSTOMER',0,1);
    
    • 配置schema.xml


      5.png

    如图,
    customer表:主键是ID,autoIncrement="true"表示这个表的主键是自增长的,是逻辑表的主键自增长,dataNode是分片节点,rule是分片规则。

    mycat_sequence表:主键是name,dataNode是在其中一个分片节点下。

    • 配置rule.xml


      6.png
    • 配置server.xml

    7.png

    如图,sequncehandlerType设为1;
    0 表示是表示使用本地文件方式
    1 表示的是根据数据库来生成,就是我们自己配置的自增长
    2 表示时间戳的方式

    • 配置自增长主键
      在下图的位置中的sequence_db_conf.properties文件中添加CUSTOMER=dn1,指定在哪个分片。


      5.png
    • 测试


      8.png
    9.png 10.png

    可以看出,插入的数据均匀分配到不同的分片,并且保证了主键id的唯一。


    11.png

    再看mycat_sequence表,因为刚刚插入了6条数据,所以现在的current_value字段的值为6。

    配置完,记得重启mycat

    相关文章

      网友评论

          本文标题:mycat自增长主键配置

          本文链接:https://www.haomeiwen.com/subject/veuttqtx.html