MyCat根据数据库实现全局自增id

mycat生成全局id

Mycat:数据库中间件(分库分表)
官网指南

mycat运行需要JVM,所以先安装java环境,建议JDK1.8以上。数据库采用mysql5.7,或者8.0

下载
下载地址:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE

环境配置
linux: https://www.cnblogs.com/alexzhang92/p/10990904.html
windows:
https://www.cnblogs.com/zuidongfeng/p/7793098.html

Mycat 读写分离、主从切换、分库分表等操作

推荐博客园散尽浮华技术博文
https://www.cnblogs.com/kevingrace/p/9365840.html

好了,回到正题

  1. 创建原始数据库表
#创建数据库
create database Mycat_sql01;

#添加表
use Mycat_sql01
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;

#创建数据库
create database Mycat_sql02;

#添加表
use Mycat_sql02
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;

  1. 创建Mycat生成唯一主键的表(MYCAT_SEQUENCE)及函数
    后边会为Mycat_sql01、Mycat_sql02两库创建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 ;

2.1 将数据库中要自增的表名称(test)添加到MYCAT_SEQUENC表(表名大写)

#设定TEST3表的增长方式为 步进为1 ,
insert into MYCAT_SEQUENCE (name,current_value,increment) values (‘TEST’,0,1);


3. 配置maycat

3.1 配置schemal.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="Mycat_test" checkSQLschema="true" sqlMaxLimit="1000">
                <table name="test" dataNode="node1,node2" primaryKey="id" autoIncrement="true"  type="global"/>
        </schema>

        <dataNode name="node1" dataHost="localhost" database="Mycat_sql01" />
        <dataNode name="node2" dataHost="localhost" database="Mycat_sql02" />

        <dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>

                <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" />

        </dataHost>


</mycat:schema>

checkSQLschema=“true”:自增
primaryKey=“id”:主键
type=“global”:全局的表

3.2 配置server.xml

<property name="sequnceHandlerType">1</property>

0 表示是表示使用本地文件方式
1 表示的是根据数据库来生成,就是我们自己配置的自增长
2 表示时间戳的方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)

3.3 配置sequence_db_conf.properties

TEST3=node1

注意表名大写
node1即为MYCAT_SEQUENCE表及函数所在的节点

3.4 重启Mycat

4.测试

#插入数据
insert into test (name) value ('xiaowang');
#插入多条数据
insert into test (name) values ('zhanghu'),('mayun'),('huangyu'),('zhangxun');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值