zoukankan      html  css  js  c++  java
  • MyCat教程六:全局序列号-全局主键的自增长

      前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现

    全局主键自增

    一、本地文件自增方式

      首先我们来看下第一种方式,也就是本地文件自增方式

    1. 修改分片策略

      我们原来配置的分片策略crc32slot是不支持主键自增的,所以我们需要修改为auto-sharding-long

    在这里插入图片描述

    2. 修改server.xml文件

      server.xml文件中的sequnceHandlerType是用来配置主键生成类型的

    sequnceHandlerType值 说明
    0 本地文件自增方式
    1 数据库自增方式
    2 本地时间戳自增方式

    所以我们需要先把sequnceHandlerType的值修改为0

    在这里插入图片描述

    3.sequence_conf.properties介绍

      在conf目录下的sequence_conf.properties 中有序列的相关配置信息

    #Wed Oct 16 07:40:44 CST 2019
    COMPANY.MAXID=2000
    GLOBAL.MAXID=20000
    COMPANY.HISIDS=
    CUSTOMER.MAXID=2000
    HOTNEWS.CURID=1000
    ORDER.MINID=1001
    CUSTOMER.HISIDS=
    HOTNEWS.MINID=1001
    GLOBAL.CURID=10002
    ORDER.MAXID=2000
    COMPANY.CURID=1000
    CUSTOMER.CURID=1000
    COMPANY.MINID=1001
    GLOBAL.MINID=10001
    HOTNEWS.MAXID=2000
    CUSTOMER.MINID=1001
    GLOBAL.HISIDS=
    HOTNEWS.HISIDS=
    ORDER.HISIDS=
    ORDER.CURID=1000
    

    主要的是GLOBAL.MAXID=20000 GLOBAL.CURID=10002 GLOBAL.MINID=10001 可以自行设置

    4.测试实现

    插入语句中主键字段用next value for MYCATSEQ_GLOBAL 替代

     insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)
    

    二、本地时间戳自增方式

     使用时间戳的方式,我们不需要分配策略或者选择其他的分片策略。

    在这里插入图片描述

    在这里插入图片描述

    1.修改server.xml文件

      将server.xml文件中的sequnceHandlerType修改为2

    在这里插入图片描述

    2.重启mycat

      修改了配置文件,要让其生效需重启服务。

    在这里插入图片描述

    3.插入数据测试

     insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)
    

    时间戳太长将id修改为 varchar类型。

    在这里插入图片描述

    生成成功~

    三、数据库自增方式

    1.创建序列表和相关函数

      第三种方式是在Mycat所管理的某个数据库中创建一张自增的表结构来维护相关的数据,相关的脚本官方提供的有,如下:

    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 ;
    

    我们把这些脚本在demo2上执行

    在这里插入图片描述

    2.修改server.xml

    在这里插入图片描述

    3.修改sequence_db_conf.properties文件

      因为demo2对应的逻辑库是 dn2所以我们需要修改此处

    在这里插入图片描述

    4.测试

      重启服务并插入数据测试

    在这里插入图片描述

     insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'hg-93',23)
    

    主键的生成成功,除了这三种方式以外还可以通过`zookeeper`来维护自增的主键,这个可以自行实现


    关注微信公众号【程序员的梦想】,专注于Java,SpringBoot,SpringCloud,微服务,Docker以及前后端分离等全栈技术。

    在这里插入图片描述

查看全文
  • 相关阅读:
    3.for in循环
    2.break与continue
    1.XHTML框架结构
    lamda表达式在EF中的应用
    View数据呈现相关技术
    ASP.NET MVC 4 技术讲解
    ASP.NET MVC 相关的社群与讨论区
    C# 随机红包算法
    圆圈里带 小写字母,大写字母
    使用SQL语句 检测 MSSQL死锁
  • 原文地址:https://www.cnblogs.com/cxydmx/p/11740752.html
  • Copyright © 2011-2022 走看看