在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式,实现方式主要有三种:本地文件方式数据库方式本地时间戳算法。

  一、本地文件方式

    原理:此方式MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下conf中的sequence_conf.properties文件中sequence当前的值。

    譬如:    

#default global sequence GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
#其中HISIDS表示使用过的历史分段(一般无特殊需要可不配置),MINID表示最小ID值,MAXID表示最大ID值,CURID表示当前ID值。

   使用方式:

   1、配置MyCat的Server.xml

# 其中0,表示使用本地文件方式。
<system><property name="sequnceHandlerType">0</property>
</system>

   2、配置sequence_conf.properties  

$ vim mycat/conf/sequence_conf.properties
#default global sequenceGLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

    设置完成以后重启MyCat

  3、测试 

mysql> create table test(id int,name varchar(20));mysql> insert into test(id,name) values(next value for MYCATSEQ_GLOBAL,@@hostname);mysql> select * from test;

    

#此时,sequence_conf.properties中GLOBAL.CURID值为10001。当然,可以使用sequence_conf.properties中定义的任何规则,譬如:
# self define sequenceCOMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000# COMPANY 就是要使用自增的配置,在这里也可以使用其他的名字,但必须是大写的;定义以后可以在全局使用。#可以使用 mysql>select next value for MYCATSEQ_xxx(自定义的名字); 来查看下一个自增ID。

  二、数据库方式   

    原理:在数据库中建立一张表,存放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剩余值不会再使用。

  

    使用方式:

   1、配置Server.xml

# 其中1,表示使用数据库方式。
<system><property name="sequnceHandlerType">1</property>
</system>

   2、在其中一个分片点对应的数据库中创建表和存储过程

      因我在schema.xml 中配置的是: <dataNode name="dn$1-4" dataHost="localhost1" database="db$1-4" />

       譬如我在dn2中创建,对应的数据库名为db2(为什么这里会涉及到datanode,因为后续的sequence_db_conf.properties文件会使用到),

      注意,是登录到数据库中创建,

      而不是在mycat中创建。   

--  创建MYCAT_SEQUENCE表CREATE TABLE MYCAT_SEQUENCE (
`name` VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
remark varchar(100),  -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护
PRIMARY KEY(name)) ENGINE=InnoDB;
-- – 获取当前sequence的值(返回当前值,增量)
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
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 ;-- 设置sequence值
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- 获取下一个sequence值
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ; 

      在表MYCAT_SEQUENCE中,其中:

       – name sequence名称
             – current_value 当前value
             – increment增长步长! 可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.

        注意:MYCAT_SEQUENCE必须大写。

       创建存储函数:

        注意:必须在同一个数据库中创建,在本例中,是db2。一共要创建三个。

        – 获取当前sequence的值(返回当前值,增量)

    3、  插入sequence记录

-- 插入sequence记录
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('DICT', 1, 100,'match:tb_dic');INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('GLOBAL', 1, 100,'GLOBAL');
-- 代表插入了一个名为mycat的sequence,当前值为1,步长为100。

mysql> select * from mycat_sequence;
+----------------+---------------+-----------+--------------------------------+
| name           | current_value | increment | remark                         |
+----------------+---------------+-----------+--------------------------------+
| DICT           |             1 |       100 | match:tb_dic                   |
| GLOBAL         |           200 |       100 | GLOBAL                         |
+----------------+---------------+-----------+--------------------------------+

  

    至此,数据库方面的准备工作已结束完毕。

  4、设置 sequence_db_conf.properties

     在mycat conf目录下的sequence_db_conf.properties文件中添加如下内容:DICT=dn3 dn3:表示我把表和函数都建在了dn3节点上

     注意:DICT必须为大写,这个与表的数据是否大写无关,事实上,MYCAT_SEQUENCE中name是否大小写对结果没有影响。

       重启MyCat

  5、开始测试

    

$ mysql -h127.0.0.1 -utest -ptest -P8066 -DTESTDB
mysql>
create table tb_dic
(id                   int not null auto_increment,dic_name             varchar(100) not null comment '字典名称',dic_value            varchar(20) not null comment '字典值',dic_type             int not null comment '字典类型: 如果是类型,如支付方式等',primary key (id)
);
# 然后插入值
mysql>  INSERT into tb_dic(id,dic_name,dic_value,dic_type) VALUES(next value for MYCATSEQ_DICT,'支付方式','1',0);
+-----+--------------+-----------+----------+
| id  | dic_name     | dic_value | dic_type |
+-----+--------------+-----------+----------+
| 101 | 活动形式      | 2         |        0 |
| 102 | 表单类型      | 2         |        0 |
+-----+--------------+-----------+----------+

    错误处理: 

ERROR 1003 (HY000): mycat sequnce err.org.opencloudb.config.util.ConfigException: can't find definition for sequence :DICT

    因为对于sequence_db_conf.properties的修改当前的mycat并不知晓,这时候,可重启mycat或者登录9066管理端口进行 reload @@config;

    至此,测试完毕,关键还是两点:MYCAT_SEQUENCE必须大写,sequence_db_conf.properties文件中DICT=dn3必须大写。

  三、本地时间戳算法

    待续。。。

    

  

MyCat 主键ID自增长配置相关推荐

  1. Oracle使用序列触发器实现主键id自动增长

    记录一下oracle中的字段自增问题 在mysql中我们可以使用auto_increment来实现自动增长功能 而在oracle主键没有自动增长类型,所以一般使用序列产生的值作为某张表的主键,实现主键 ...

  2. mybatis多表新增如何获取主键ID

    记录一下碰到的问题,就当做是笔记吧,防止忘记.在做ssm多表新增的时候,碰到了一个小问题,就是在新增成功一个表的时候我要获取它的ID,然后用它的ID新增下一个表. 但是,我要怎么做呢?新增成功,再查询 ...

  3. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作. 在使用mybatis作为ORM组件时,可以很方便地达到这 ...

  4. MyBatis在insert插入操作时返回主键ID

    数据库为MySql时:  <insert id="insert" parameterType="com.test.User" keyProperty=&q ...

  5. 【Hibernate】hibernate主键生成策略与配置详解

    //####################################################### **Hibernate各种主键生成策略与配置详解** //############# ...

  6. mysql从零开始自增id_MySQL从零开始 7-表约束之主键,自增长,唯一键

    表约束除了空属性,默认值,描述符以及零填充外(空属性,默认值default,列描述comment以及零填充zerofill),还有主键,自增长,唯一键等对字段的索引和扩展约束. 1. 主键 使用 pr ...

  7. MyBatis——insert并返回主键ID解决方案

    问题描述 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值. 问题分析 暂无. ...

  8. mybatis插入数据后返回自增主键ID详解

    1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...

  9. mysql自增长主键_MySQL数据库8(九)列属性之主键、自增长

    主键 顾名思义,主要的键,primary key,在一张表中,有且只有一个字段,里面的值具有唯一性 创建主键 随表创建 系统提供了两种增加主键的方式: 1.直接在需要当做主键的字段之后,增加prima ...

  10. Mybatis 插入数据后返回自增主键ID

    1 xml 映射文件中处理 在映射器中配置获取记录主键值 在xml中 insert 标签中定义 : useGeneratedKeys为true,用来设置返回主键id的值, keyProperty 代表 ...

最新文章

  1. 9.mybatis动态SQL标签的用法
  2. 6大最流行、最有用的自然语言处理库对比
  3. 织梦cms技巧:织梦登录后台显示空白页的解决办法
  4. 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...
  5. codeforce gym 100548H The Problem to Make You Happy
  6. 修改FTP服务器端口后无法访问
  7. 复练-面试的科技树-我是谁、我喜欢、我能够
  8. oracle数据库实践,RubyonRails连接Oracle数据库实践
  9. C# 创建Excel并写入内容
  10. python requests post请求_Python“requests”模块中的POST请求无法正常工作
  11. 回首2018 | 分析型数据库AnalyticDB: 不忘初心 砥砺前行
  12. java constants无法使用_轻松看懂Java字节码
  13. Intel与三星合作新移动操作系统Tizen 拥抱HTML5
  14. 框架学习笔记:Unity3D的MVC框架——StrangeIoC
  15. vsftpd配置权限问题
  16. app漏洞扫描原理_APP漏洞如何检测,如何检测出app有漏洞?
  17. Android 设备解锁
  18. mac上破解photoshop cs6
  19. H264 FU-A解包分析
  20. 【问题记录】04 MyBatis报错:Parameter ‘XXX‘ not found. Available parameters are [page, hashMap, param1, param

热门文章

  1. Ubuntu 12.04重启后丢失resolv.conf问题
  2. 江西省建设工程安全质量监督管理局全省工程安全质量信息数据维护升级存储及异地备份项目中标公告...
  3. 2008 DHCP中继器代理服务
  4. NUMA架构下的CPU拓扑
  5. IOMMU 虚拟IO地址和物理地址相关联
  6. 深入解读Linux进程调度Schedule
  7. FreeSwitch Lua编程接口(1)dialplan里的配置
  8. 3804. 构造字符串-AcWing题库
  9. PyTorch入门(三)损失函数与反向传播
  10. matlab quiver 箭头颜色,matlab – quiver3箭头颜色对应大小