欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyCat教程六:全局序列号-全局主键的自增长

程序员文章站 2022-04-15 14:49:20
前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现 全局主键自增 一、本地文件自增方式 首先我们来看下第一种方式,也就是本地 ......

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

全局主键自增

一、本地文件自增方式

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

1. 修改分片策略

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

MyCat教程六:全局序列号-全局主键的自增长

2. 修改server.xml文件

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

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

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

MyCat教程六:全局序列号-全局主键的自增长

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)

二、本地时间戳自增方式

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

MyCat教程六:全局序列号-全局主键的自增长

MyCat教程六:全局序列号-全局主键的自增长

1.修改server.xml文件

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

MyCat教程六:全局序列号-全局主键的自增长

2.重启mycat

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

MyCat教程六:全局序列号-全局主键的自增长

3.插入数据测试

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

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

MyCat教程六:全局序列号-全局主键的自增长

生成成功~

三、数据库自增方式

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上执行

MyCat教程六:全局序列号-全局主键的自增长

2.修改server.xml

MyCat教程六:全局序列号-全局主键的自增长

3.修改sequence_db_conf.properties文件

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

MyCat教程六:全局序列号-全局主键的自增长

4.测试

  重启服务并插入数据测试

MyCat教程六:全局序列号-全局主键的自增长

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

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