• Mycat探索之旅(3)----Mycat的全局序列号


    一、本地文件方式

    原理:此方式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服务

    测试:

    clip_image001

    二、使用数据库方式

    原理:在数据库中建立一张表,存放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;

    clip_image002

    – 插入一条sequence

    INSERT INTO MYCAT_SEQUENCE (
        NAME,
        current_value,
        increment
    )
    VALUES
        ('GLOBAL', 100000, 100);

    clip_image003

    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

    clip_image004

    – 设置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

    clip_image005

    – 获取下一个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

    clip_image006

    3) sequence_db_conf.properties相关配置,指定sequence相关配置在哪个节点上:

    clip_image007

    这里设置的是dn1节点,那么上面的函数及表都是建立在dn1节点对应的数据库实例上的

    注意:MYCAT_SEQUENCE表和以上的3个function,需要放在同一个节点上。function请直接在具体节点的数据库上执行

    测试:

    insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'hexmith');

    clip_image008

    insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'Mycat');

    clip_image009

    在前面的测试中,我添加到MYCAT_SEQUENCE表中的数据设置的步长是100,此处吻合。

  • 相关阅读:
    POJ2253Frogger
    POJ3982The Fibonacci sequence
    POJ3259Wormholes
    POJ1062Expensive dowry
    POJ1860Currency Exchange
    POJ1789Truck History .
    POJ2602Superlong sums
    POJ1125Stockbroker Grapevine
    POJ2485Highways
    POJ2240Arbitrage
  • 原文地址:https://www.cnblogs.com/doctorJoe/p/5259011.html
Copyright © 2020-2023  润新知