19. Mycat全局序列

简介

无论分多少个节点,id不可能重复,这就是全局序列

三种方式

本地文件

在Mycat建一个文件,专门存second序列,假设初始值为1,每当有insert语句执行时,使其+1,无论分到哪个数据节点都不会重复。

Mycat部署的服务器,一旦宕机,这个文件就无法读取,即使有备机,也无法使用,抗风险能力较差,不推荐。

数据库方式

利用数据库一个表来进行计数累加,但是并不是每次生成序列都读写数据库,这样效率太低,Mycat会预加载一部分号段到Mycat的内存中,这样大部分读写序列都是在内存中完成的。如果内存中的号段用完了 Mycat会再向数据库要一次。

如果Mycat崩溃了 ,当它重启之后,会向数据库申请新的号段,原有号段会弃用,但是不会因此出现主键重复,推荐使用这种方式!

配置
  1. 首先在主机创建表、脚本

    # 建表
    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;
    
    # Mycat提供的3个函数
    DELIMITER $$
    CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
    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;
     
    DELIMITER $$
    CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64)
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = VALUE
    WHERE NAME = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $$
    DELIMITER;
     
    DELIMITER $$
    CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) 
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value + increment WHERE NAME = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $$
    DELIMITER;
    
    # 插入数据
    INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('ORDERS', 400000, 100);
    
  2. 修改sequence_db_conf.properties

    image-20201120114542934

    意思是 ORDERS这个序列在dn1这个节点上,具体dn1节点是哪台主机,查看schema.xml

  3. 修改server.xml,默认是2,修改为1

    image-20201120114649798

  4. 向Mycat中插入数据

    insert into `orders`(id,amount,customer_id,order_type) values(next value for MYCATSEQ_ORDERS,1000,101,102);
    
  5. 结果,插入成功

    image-20201120122327052

  6. 模拟Mycat宕机,重启后,重新插入数据,跳过之前号段的,步长+100

    image-20201120122542212

时间戳方式

一旦数据经过Mycat服务器,取Mycat主机的时间戳作为全局序列,并且时间戳会不断变大,还不会重复。就算是主机挂了,从机上线,只要保证主机从机的时间一致,那就可以继续使用,比较好的一点就是,不需要配置文件,直接取系统时间,实现方式较为简单。

但是它有一个很不好的缺点,它的字段太长了,有18位,比如说要在订单表这种数据量较大的表中作为id使用,就有点浪费空间了,所以这种方式也不推荐。

自主生成

如果要使用自主生成的全局序列,那么Java程序中也需要写对应代码。

  • 可以根据业务逻辑组合
  • 可以利用redis的单线程原子性incr来生成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值